【问题标题】:C++: Reading a character is incorrectC ++:读取字符不正确
【发布时间】: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 位文本数据时,字符集很重要。
  • 感谢博佩尔松;使用无符号字符数组似乎已经解决了这个问题。

标签: c++ char hex scanf


【解决方案1】:

将 buf[i] 转换为 unsigned char - 字符被正确读取 - 但在打印时 - 因为它是负数 - 它被扩展为 int 然后大小写为 unsigned int 所以你看到 ffffff92 - 转换为 unsigned 应该正确显示值

#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

【讨论】:

  • @UserX 你的编译器是什么 - 因为我得到了 gcc 5.4 的预测输出
猜你喜欢
  • 1970-01-01
  • 2021-12-21
  • 2012-01-19
  • 2019-07-06
  • 2020-08-01
  • 2015-02-19
  • 2021-10-06
  • 2020-06-08
  • 2017-11-26
相关资源
最近更新 更多