C++:读取字符不正确

问题描述:

获取奇怪的问题,尝试从C++中的文本文件中读取字符。当它找到一个撇号(十六进制92)时,它将其读取为多个字符。对于字符串“这是”我得到这个:C++:读取字符不正确

i - 69 
t - 74 
’ - ffffff92 
s - 73 
it’s 

下面的代码:

{ 
    FILE* fp = fopen("word.txt", "rb"); 
    char buf[111]; 

    fscanf(fp, "%s", buf); 

    for (int i = 0; i < strlen(buf); ++i) 
     printf("%c - %x\n", buf[i], buf[i]); 

    printf(buf); 
} 

开幕为“R”给出了相同的结果。我怎样才能读撇号作为它的单个字符?谢谢!

+1

这看起来更像是C.这是C 2 – Ron

+0

这是C++,但它也会在C中编译。我使用流获得相同的结果。 – UserX

+3

如果'char'被签名(可能),它将在可变参数函数中被提升为'int'时得到符号扩展。将签名值打印为无符号可能会导致意外输出。 –

将buf [i]转换为无符号字符 - 字符被正确读取 - 但是当打印时 - 因为它是负的 - 它被扩展为int,然后加载到unsigned int,以便看到ffffff92 - 将转换为无符号值应显示值正确

#include<cstdio> 

int main() { 

    char ch = static_cast<char>(0x92); 
    printf("%c - %x/%x\n", ch,ch,static_cast<unsigned char>(ch)); 

    return 0; 
} 

输出

$ ./test 
� - ffffff92/92 
+0

谢谢,但我已经尝试过,结果相同。 – UserX

+0

@UserX你的编译器是什么 - 因为我用gcc 5.4得到了预测的输出 –