我的一位朋友向我展示了阅读角色产生意外行为的情况。读字符'<!>#164;'导致他的程序崩溃。我得出结论'<!>#164;'是十六进制的164,因此它超过了ASCII范围。

我们注意到'<!>#164;'上的行为但任何字符<!> gt; 127似乎都显示出问题。问题是我们如何通过char可靠地读取这些字符char?

int main(int argc, const char *argv[])
{
    char input;
    do
    {
        cin >> input;
        cout << input;
        cout << " " << setbase(10) << (int)input;
        cout << " 0x" << setbase(16) << (int)input;

        cout << endl;
    } while(input);
    return 0;
}


masse@libre:temp/2009-11-30 $ ./a.out 
¤
 -62 0xffffffc2
¤ -92 0xffffffa4
有帮助吗?

解决方案

您的系统正在使用UTF-8字符编码(应该如此),因此字符'<!>#164;'使您的程序读取字节序列C2 A4。由于char是一个字节,因此它一次读取一个字节。查看wchar_t和相应的wcinwcout流来读取多字节字符,但我不知道它们支持哪些编码或者如何使用区域设置。

另外,你的程序正在输出无效的UTF-8,所以你真的不应该看到这两个字符<!>#8212;我的系统上有问号。

(这是一个挑剔的,有些偏离主题,但你的while(input)应该是while(cin),否则你将获得无限循环。)

其他提示

很难说为什么你的朋友的程序在没有看到代码的情况下崩溃,但可能是因为你使用char作为数组的索引。由于常规ASCII范围之外的字符将超出signed char的限制,因此char将最终为负数。

将'input'声明为unsigned char而不是

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top