在c中识别和打印出货币符号

时间:2014-01-27 01:56:19

标签: c currency

我目前正在完成一项任务,其中一部分我遇到了麻烦。我需要能够从终端识别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);
}

1 个答案:

答案 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

然而..

输入实际上可能来自文件或其他东西,而根本不是来自键盘。因此,您应该正确处理EOFEOF不适合(已签名或未签名)char,也不适合uint8_t。这意味着您应该将getchar()返回的值存储在int中,然后与EOF进行比较,然后使用类型转换将其转换为unsigned charuint8_t比较它0xAC。

基本上,它有点像这样:

    int c;

    c = getch();
    if(c == EOF) exit(0);
    if( (uint8_t)c == 0xC2) {
        ...
    }