【问题标题】:identifying and printing out currency symbols in c在c中识别和打印货币符号
【发布时间】:2014-01-27 01:56:18
【问题描述】:

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

【问题讨论】:

  • 您能解释一下您遇到的问题吗?
  • 这是一个问答网站。如果您不提出问题,您将不会得到答案。
  • 对不起,我第一次使用这个网站,问题是在输入符号时它无法识别符号,而是总是返回 $。
  • @user3238882:char 是签名的还是未签名的?如果它是有符号的(可能),它如何存储大于 127 的值,它如何等于大于 127 的值(如 0x82,或 0xAC,或...)?
  • 你应该添加评论并尽可能使用'<char>',不要使用这样的十六进制代码,没有人会知道你在说哪个字符

标签: c currency


【解决方案1】:

对于很多 C 编译器来说,char 是一个有符号的 8 位整数。

带符号的 8 位整数只能保存从 -128 到 127 的值。它们不能保存像 0x80、0xE2 等这样的值。

对于像if(c == 0xAC) 这样的东西,编译器知道c 中的值不能高于127,因此知道条件必须为假。出于这个原因,编译器可以优化您的代码(通过消除由于“必须为假”条件而无法访问的所有代码)到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) {
        ...
    }

【讨论】:

  • 帮助很大!非常感谢您逐步解释所有内容并提供解决问题的不同选项。
猜你喜欢
  • 2011-05-09
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多