C++;:读取字符是不正确的 一个奇怪的问题试图从C++中的文本文件中读取字符。当它找到一个撇号(十六进制92)时,它将其读取为多个字符。对于字符串“it's”,我得到: i - 69 t - 74 ’ - ffffff92 s - 73 it’s

C++;:读取字符是不正确的 一个奇怪的问题试图从C++中的文本文件中读取字符。当它找到一个撇号(十六进制92)时,它将其读取为多个字符。对于字符串“it's”,我得到: i - 69 t - 74 ’ - ffffff92 s - 73 it’s,c++,char,hex,scanf,C++,Char,Hex,Scanf,代码如下: { 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); } { 文件*fp=fopen(“word.txt”、“rb”); char-buf[

代码如下:

{
    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);
}
{
文件*fp=fopen(“word.txt”、“rb”);
char-buf[111];
fscanf(fp,“%s”,buf);
对于(int i=0;i

以“r”开头会给出相同的结果。我怎样才能把撇号理解为一个字符呢?谢谢

将buf[i]强制转换为无符号字符-正确读取字符-但在打印时-由于它是负数-它被扩展为int,然后大小写为无符号int,因此您可以看到FFFFFF 92-强制转换为无符号字符应该正确显示值

#include<cstdio>

int main() {

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

    return 0;
}

这看起来更像C.,是C,它是C++,但它也会编译成C。我使用流来得到相同的结果。如果<代码> char 被签名(可能),它会在一个变量函数中被提升为<代码> int >代码时得到符号扩展。将有符号值打印为无符号可能导致意外输出。请注意,0x92不是规范撇号。这将是0x27(Unicode U+0027撇号)。0x92不在ASCII范围内,因此需要进行字符集解释。例如,0x92在Windows-1252中是Unicode U+2019右单引号,但在其他字符集中是不同的/未定义的。在处理8位文本数据时,字符集很重要;使用无符号字符数组似乎解决了这个问题。@UserX您的编译器是什么?因为我使用gcc 5.4获得了预测输出
$ ./test
� - ffffff92/92