【发布时间】:2015-10-26 12:45:53
【问题描述】:
如果我使用一个字符长键一切正常,但如果我使用更长的键程序崩溃。 对于此输入:'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 *'”。这是一个可能导致崩溃的错误。
-
测试
fscanf(fpIn, "%02X", &ch)与EOF的返回值可能不是一个好主意。如果由于其他原因转换失败并返回零怎么办?我会写while(fscanf(fpIn, "%02X", &ch) == 1)代替(或者%02hhX可能是char变量)。 -
试试
unsigned char ch ;-->unsigned ch ;
标签: c encryption vigenere