我正在讀取一個NES ROM文件,其中前四個字節是「\ x4e \ x45 \ x53 \ x1a」或NES \ x1a。在我的實際代碼中,給定的文件可以是任意的,所以我想檢查以確保這個頭文件在這裏。但是,我遇到了一些麻煩,這下面的代碼演示:字符串比較中的十六進制文字問題
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
fp = fopen("mario.nes", "rb");
char nes[4];
char real_nes[4] = "NES\x1a";
fread(nes, 4, 1, fp);
printf("A: %x\n", nes[3]);
printf("B: %x\n", real_nes[3]);
printf("C: %s\n", nes);
printf("D: %s\n", real_nes);
if (strcmp(nes, real_nes) != 0) {
printf("not a match\n");
}
fclose(fp);
return 0;
}
返回:
A: 1a
B: 1a
C: NES?
D: NES
not a match
其中的問號是\ X1A。
我是C新手,所以可能我錯過了一些細微的(或明顯的)關於兩個字符串不匹配的原因,以及爲什麼問號在打印D行時不顯示,以表示\ x1a在字符串的末尾,B行似乎表明它應該是。
感謝您對字符串的更全面的解釋。 – v64 2009-09-07 18:42:03
即使在這個例子中,當做'fread(nes,4,1,fp)'時,'你沒有向nes [4]添加空終止符,所以比較也可能不起作用。 'nes [4] = 0;'應該被添加。 – Petruza 2010-04-21 12:20:23