如果我使用一个字符长的键,一切正常,但如果我使用更长的键,程序就会崩溃。 对于此输入:'2A282E2A282E' 应该输出这个:'aaaaaa'
#include <stdio.h>
#define KL 3
main()
{
unsigned char ch;
FILE *fpIn, *fpOut;
int i;
unsigned char key[KL] = {0x4B, 0x49, 0x4F};
fpIn = fopen("ctext.txt", "r");
fpOut = fopen("dtext.txt", "w");
i=0;
while(fscanf(fpIn, "%02X", &ch) != EOF)
{
fprintf(fpOut, "%c", ch ^ key[i % KL]);
i++;
}
fclose(fpIn);
fclose(fpOut);
return(0) ;
}
最佳答案
当我用 GCC 编译你的程序时,我收到警告“格式 '%X' 需要类型为 'unsigned int *' 的参数,但参数 3 的类型为 'unsigned char *'”。这是一个可能导致崩溃的错误,因为 char 通常是一个字节宽,而 int 通常是四个字节。 fscanf 将尝试将四个字节的数据放入您的单字节空间,并愉快地覆盖后面的任何数据。
正如 BLUEPIXY 在评论中建议的那样,您只需将 unsigned char ch
替换为 unsigned ch
。
除此之外,当我尝试它时它起作用了,我没有发现其他明显的问题,除了你应该检查 fopen 的返回值。
关于c - C 中的 Vigenere 代码因多字符键而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33346128/