我目前正在完成一项任务,其中一部分我遇到了麻烦。我需要能够从终端识别5种不同的货币符号($,£,¥,€,₹)并将其打印回来。这是我指定完成此部分的功能。 教授告诉我们,每个教授使用UTF-8代码组合来识别各个符号。此函数尝试执行的所有操作是查看下一个字符是否为其中一个符号,如果是,则打印该特定符号。如果它不识别任何4种“外国”货币,它将默认该符号为$,即使它是一个数字或不同的符号。谢谢你的帮助!
determcur()
{
char c = getchar();
if(c == 0xC2)
{
c = getchar();
if(c == 0xA3)
{
printf("%c%c", 0xC2, 0xA3);
}
if(c == 0xA5)
{
printf("%c%c", 0xC2, 0xA5);
}
}
if(c == 0xE2)
{
c = getchar();
if(c == 0x82)
{
c = getchar();
if(c == 0xAC)
{
printf("%c%c%c", 0xE2, 0x82, 0xAC);
}
if(c == 0xB9)
{
printf("%c%c%c", 0xE2, 0x82, 0xB9);
}
}
}
else printf("%c", 0x24);
}
答案 0 :(得分:2)
对于许多C编译器,char
是带符号的8位整数。
带符号的8位整数只能保存-128到127之间的值。它们不能保存0x80,0xE2等值。
对于类似if(c == 0xAC)
的内容,编译器知道c
中的值不能高于127,因此知道条件必须为false。因此,编译器可以优化您的代码(通过消除因“必须为假”条件而无法访问的所有代码),直到getchar();printf("%c", 0x24);
。
要解决此问题,请使用uint8_t
代替char
。如果你找不到uint8_t
(例如你被古老的C语言所困),那就使用unsigned char
。
然而..
输入实际上可能来自文件或其他东西,而根本不是来自键盘。因此,您应该正确处理EOF
。 EOF
不适合(已签名或未签名)char
,也不适合uint8_t
。这意味着您应该将getchar()
返回的值存储在int
中,然后与EOF
进行比较,然后使用类型转换将其转换为unsigned char
或uint8_t
比较它0xAC。
基本上,它有点像这样:
int c;
c = getch();
if(c == EOF) exit(0);
if( (uint8_t)c == 0xC2) {
...
}