简单的XOR加密程序无法按预期工作

时间:2015-12-06 13:30:32

标签: c

我正在用C语言编写一个简单的XOR加密程序。

应该逐行读取文本文件 并创建一个新的加密文件。

  

问题是它只加密文件中的第一行,跳过文件的其余部分。

这是我提出的代码。 根据我的分析,它应该逐行加密文件。 但显然我在某处错了,这就是为什么它行为不端。

如果有人能够指出我的错误,那将是非常有帮助的。

#include <stdio.h>
void encrypt(char *msg);

int main()
{
  char line[100];  //all lines in file are shorter than 100 characters
  FILE *in=fopen("msg.txt","r");
  FILE *out=fopen("encrypted_msg.txt","a");

  while(fscanf(in,"%99[^\n]",line)==1) // I included scanset to read new line in every iteration
  {
    encrypt(line);
  }

  fprintf(out,"%s\n",line);
  return 0;
}

void encrypt(char *msg)
{
  while(*msg)
  {
    *msg=*msg^31;
    msg++;
  }
} 

2 个答案:

答案 0 :(得分:2)

这很简单。只需添加:

char c = fgetc(in);

while内阅读结束日\n

像这样:

while(fscanf(in,"%99[^\n]",line)==1) 
{
    encrypt(line);
    char c = fgetc(in);
}

您指定fscanf来读取换行符\n以外的所有符号,因此在第一次while次迭代后,输入中有一个\n,第二个while迭代fscanf无法读取任何内容,因为您从允许的字符集中排除\n

答案 1 :(得分:0)

我认为Edgar Rokyan的答案是有效的,因为fscanf不会删除行中的\ n,因此下次第一个字符串出现时会出现\ n,因此无法读取任何内容。我的解决方案是使用fgets而不是将\ n读入行缓冲区(如果你不想要它,只需用if语句检查它并将最后一个char更改为\ 0)。

while(fgets(line, 99, in)) // I included scanset to read new line in every iteration
{
    encrypt(line);
}

或者摆脱行尾的\ n。

while(fgets(line, 99, in)) // I included scanset to read new line in every iteration
{
    int len = strlen(line);
    if(line[len - 1] == '\n')
        line[len - 1] = '\0';
    encrypt(line);
}