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”给出了相同的结果。我怎样才能读撇号作为它的单个字符?谢谢!
答
将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得到了预测的输出 –
这看起来更像是C.这是C 2 – Ron
这是C++,但它也会在C中编译。我使用流获得相同的结果。 – UserX
如果'char'被签名(可能),它将在可变参数函数中被提升为'int'时得到符号扩展。将签名值打印为无符号可能会导致意外输出。 –