我的一位朋友向我展示了阅读角色产生意外行为的情况。读取角色'¤'导致他的程序崩溃。我得出结论,'¤'是十六进制的164,所以它超过了ASCII范围。
我们注意到'¤'上的行为,但任何字符> 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
答案 0 :(得分:2)
您的系统使用UTF-8字符编码(应该如此),因此字符“¤”会使您的程序读取字节序列C2 A4
。由于char
是一个字节,因此它一次读取一个字节。查看wchar_t
以及相应的wcin
和wcout
流来读取多字节字符,但我不知道它们支持哪些编码或者如何使用区域设置。
另外,你的程序正在输出无效的UTF-8,所以你真的不应该看到这两个字符 - 我的系统上出现了问号。
(这是一个挑剔的,有些偏离主题,但你的while(input)
应该是while(cin)
,否则你将获得无限循环。)
答案 1 :(得分:1)
很难说为什么你的朋友的程序在没有看到代码的情况下崩溃,但可能是因为你使用char作为数组的索引。由于常规ASCII范围之外的字符将超出signed char的限制,因此char将最终为负数。
答案 2 :(得分:1)
将'input'声明为unsigned char而不是