【发布时间】:2018-02-07 07:39:36
【问题描述】:
尝试从 C++ 中的文本文件中读取字符时遇到一个奇怪的问题。当它找到一个撇号(十六进制 92)时,它会将其读取为多个字符。对于字符串“it's”,我得到了这个:
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”开头的结果相同。如何将撇号读取为单个字符?谢谢!
【问题讨论】:
-
这看起来更像 C。这是 C 吗?
-
它是 C++,但它也可以用 C 编译。我使用流得到相同的结果。
-
如果
char被签名(可能),当在可变参数函数中提升为int时,它将得到符号扩展。将有符号值打印为无符号可能会导致意外输出。 -
请注意,0x92 不是规范的撇号。那将是 0x27 (Unicode U+0027 APOSTROPHE)。 0x92 超出 ASCII 范围,因此它受字符集解释的影响。例如,0x92 在 Windows-1252 中是 Unicode U+2019 右单引号,但在其他字符集中不同/未定义。处理 8 位文本数据时,字符集很重要。
-
感谢博佩尔松;使用无符号字符数组似乎已经解决了这个问题。