c - 低级文件 I/O 比较字符串

标签 c low-level-io

我正在编写一个程序,它获取一个包含 3 行加密密码的文件,并将它们与 aaaa - zzzz 的所有 4 个小写字母进行比较。我遇到的唯一问题是我不知道如何逐行输入我输入的文件以及如何将它与 4 个字母的单词单独进行比较。然后它应该打印与文件中的密码相关的 3 个解密的 4 个字母的单词。另外,如果有任何关于如何改进我的代码的类型,请告诉我。我是这方面的初学者,所以如果可能的话,我需要清楚的解释和例子。谢谢。

编辑*****

主要问题出在all函数和main。我不想将 aaaa、aaab、aaac 等打印到屏幕上,但我想把它放在一个字符数组中,这样我就可以使用 crypt 将每个单独与文件中的每一行进行比较。因此,我需要有关如何将所有 456976 种组合放入一个数组、将其与每一行代码进行比较并将解决方案打印到屏幕上的建议。

文件看起来像这样:

$1$6gMKIopE$I.zkP2EvrXHDmApzYoV.B.
$1$pkMKIcvE$WQfqzTNmcQr7fqsNq7K2p0
$1$0lMKIuvE$7mOnlu6RZ/cUFRBidK7PK.

我的代码是这样的:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BUFFER_SIZE 1024

int my_fgets(char* buf, int len, int f)
{
   for (int i = 0; i < len; i++,buf++)
   {
      int count = read(f, buf, 1);
      if (!count || (buf[0] == '\n'))
      {
         buf[0] = 0;
         return i;
      }
   }
   return 0;
}

int inc(char *c,char begin, char end){
   if(c[0]==0) 
      return 0;
   if(c[0] == end){   // This make the algorithm to stop at char 'f'
      c[0]=begin;     // but you can put any other char            
      return inc(c+sizeof(char), begin, end);
   }   
   c[0]++;
   return 1;
}

char all(int a, int n,char begin, char end){
   int i, j;
   char *c = malloc((n+1)*sizeof(char));
   char result[] = "";
   for(i = a; i <= n; i++)
   {
      for(j=0;j<i;j++) c[j]=begin;
      c[i]=0;
      do {
         int k = sizeof(result);
         for (int g = 0; g < k -1; g++)
         {
            result[g] = c;
         }
      } while(inc(c,begin,end));
   }

   free(c);
}

int main(int argc, char* argv[])
{
   char *result;
   char let[456976];
   int f = open("pass.txt", O_RDONLY);
   if (f < 0) 
      return 0;
   char buf[1024];
   while (my_fgets(buf, sizeof(buf), f)) 
   {
      let = all(4,4,'a','z');
      int i = 0;
      result = crypt((let[i+1]), buf);
      int ok = strcmp (result, pass) == 0;
      return ok ? 0 : 1;

      all(4, 4, 'a', 'z');

   }
   close(f);
}

最佳答案

我认为您需要改写问题。也许下面的代码就是您想要的。假设你有一个密码,并且你有一个包含加密密码列表(通常是哈希)的文件,你想看看密码是对还是错。您将密码的哈希值与文件中的哈希值进行比较。我没有测试过这段代码。

ps,如果我跑题了请告诉我,我会删除答案。

void crypt(char* hash, const char* password_test) {
    //create hash from password, or encrypt it or something?
}

int test_password(const char *filename, const char *password){
    FILE *f;
    f = fopen(filename, "r");
    if (!f) return 0;
    char password_hash[256];
    crypt(password_hash, password);

    char hash[256];
    char buf[1024];
    while (fgets(buf, sizeof(buf), f) != NULL)
    {
        crypt(hash, buf);
        if (strcmp(password_hash, hash) == 0)
            return 1;
    }

    fclose(f);
    return 0;
}

void main() {
    int result = test_password("test.txt", "password");
    if (result == 1)
        printf("password is good\n");
}

使用open/read/close逐行读取

int my_fgets(char* buf, int len, int f)
{
    for (int i = 0; i < len; i++,buf++)
    {
        int count = read(f, buf, 1);
        if (!count || (buf[0] == '\n'))
        {
            buf[0] = 0;
            return i;
        }
    }
    return 0;
}

int main(){
    int f = open("test.txt", O_RDONLY);
    if (f < 0) return 0;
    char buf[1024];
    while (my_fgets(buf, sizeof(buf), f)) 
        printf("%s\n", buf);
    close(f);
}

关于c - 低级文件 I/O 比较字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29105006/

相关文章:

c - 打印 "test"最有效的方法?

c - 在 GTK3+ 中显示信息对话框时出错

连接远程主机然后执行系统命令的C程序

使用 Qemu 进行 ARM 汇编

c - 如何判断 "exceptional condition"是什么导致 select() 对 errorfds 使用react?

c - 当父进程发生某些事情时,父进程如何告诉子进程做某事?

c++ - 函数参数在 64 位操作系统的寄存器中传输?

matlab - MATLAB 的 Unicode 路径

c - 在低级别写入文件

c - 非常简单的地穴程序错误