我有两个文件。第一个文件(在指针key_file
中)以十六进制的形式包含以下内容(请注意,每两个字符对应一个十六进制字节):
18FC5E66F9F205488BFC0E9E
另一个文件(在指针 p_text_file
中)具有以下内容
hernandariov
我想要对这两个值执行按位异或运算,将结果保存到另一个文件中(指针为c_text_file
)。我用下面的C代码(缩写)实现:
char p_text_char;
unsigned char k_char;
for(int i = 0; i < LEN; i++) {
fscanf(key_file, "%2hhX", &k_char);
fscanf(p_text_file, "%c", &p_text_char);
fprintf(c_text_file, "%02X", k_char ^ p_text_char);
}
但是当我执行代码时,它以非零值退出,即存在错误。尝试了很多解决方案后,我发现如果我将 p_text_char
的类型更改为 int
,那么代码就可以正常工作,但我想知道原因。实际上,我希望保持 p_text_char
作为 char
,并且 k_char
作为 unsigned char
,因为这些是在我正在解决的问题(单次密码加密方案)中变量的自然类型和大小。我正在使用MinGw编译器的Windows系统。
谢谢。
- 编辑 -
在运行此代码的调试器中,我发现存在“分段错误”。为了找到错误,我尝试最小化代码。首先,我使用如下所示的文件尝试了以下代码:
#include <stdio.h>
#define LEN 12
int main() {
FILE *key_file;
key_file = fopen("key.txt", "r");
if(key_file == NULL) {
printf("ERROR: cannot read the files.");
return 1;
}
unsigned char k_char;
for(int i = 0; i < LEN; i++) {
fscanf(key_file, "%2hhX", &k_char);
}
fclose(key_file);
return 0;
}
在for循环的一次迭代后,VS Code编辑器显示了“分段错误”。当我将k_char
更改为int
时,一切正常。我会继续发布关于这个问题的发现。
fopen
调用失败而你没有检测到它,会发生什么? - Some programmer dudeNULL
指针来检查文件是否已打开。我认为这与变量类型有关。我会继续搜索。 - Lemark