使用 fgets 从文件流中将字符串读入 char 数组。 [C]

Reading a string with fgets into a char array from a filestream. [C]

我正在尝试编写一个程序来解密文件中的一系列字母。 可悲的是,我无法将字母读入 char 数组(字符串),因为我真的不知道 fgets() 函数是如何工作的。 所以我的实际代码如下所示:

#define stringlength 80

int main(void) 
{
   FILE *source;
   char puffer[stringlength], name[20];

   printf("Which file do you want to read: ");
   scanf("%s",name);
   if( (source=fopen(name,"r")) == NULL) 
   {
      fprintf(stderr, "Can not open %s\n", name);
      return EXIT_FAILURE;
   }
   while(fgets(puffer, stringlength, source))
   {
     fputs(puffer, stdout);
   }
   return EXIT_SUCCESS;
}

所以实际上这有点管用。它打开命令提示符并在 window 中写入字母序列。 但现在我必须使用每一个字母并将其与钥匙的字母进行比较。 它只是将正确的四位与异或进行比较,以使结果字母保持在 ASCII 图表的同一列中。 我已经编写了一个适用于单个字母的算法:

saveLeftFourBits = letterOfFile >> 4;
saveLeftFourBits = saveLeftFourBits << 4;
letterOfFile = letterOfFile & 0x0F;
letterOfKey = letterOfKey & 0x0F;
temp = letterOfFile ^ letterOfKey;
temp |= saveLeftFourBits;

temp 应该是生成的字母。 所以现在我正在努力研究如何从 fgets 函数中读取单个字母到变量(在 letterOfFile 中)并将其与 letterOfKey 进行比较。 或者是否有一个字符串函数可以更容易地做到这一点? 我希望有一个人可以帮助我。 :)

程序没问题。 然而,移动和掩蔽对我来说看起来很可疑。我认为您已经迷上了二进制和十六进制之间的常见混淆。二进制数是本机表示整数的格式,按位运算符仅对它们有意义。十六进制数是 ASCII 字符串,如 "F2E0",第一个字符是 "F",如 "Fred",需要将其视为文本。你可以写一个小函数来获取一个字符和 return 一个数字 0-15,或者 -1 出错(传递一个像 "K" 这样没有十六进制值的字母”)。

像这样

int hextobinary(char hex)
{
    /* logic here */
}

int hexstringtobinary(char *hexstr)
{
   int i;
   int answer = 0;
   for(i=0;hextr[i] != '[=10=]';i+++)
   {
      answer *= 16;
      answer += hextobinary(hexstr[i]);
   }
   return answer;
}

作为练习,如果传递的字符串中包含非十六进制字符,请加入错误处理。

pufferfgets 存储一行最多 80 个字符的位置,包括(如果大小允许)尾随的 \n.

要处理一行中的所有字符,请从 puffer 开始循环,直到到达行尾,即 [=15=]\n

char letterOfKey = '#';     // Define it
char *s;
for(s=puffer ; *s && *s != '\n' ; s++) {
   *s = (*s & 0xF0) | ((*s ^ letterOfKey) & 0x0F); 
}
fputs(puffer, stdout);

说明

s 指向puffer 的开头,并递增。当 s 指向的字符是 0\n 时,循环结束。对于行中的每个字符 *s,按位运算完成并存储回 *s。而且,

  • (*s & 0xF0) 保留 4 MSb
  • | 是按位或
  • (*s ^ letterOfKey) 在两个操作数之间进行异或运算
  • & 0x0F 保留 4 LSb

另见 Bitwise operations in C