【问题标题】:Conversion from char to int does something weird从 char 到 int 的转换做了一些奇怪的事情
【发布时间】:2018-03-22 18:33:59
【问题描述】:

我正在使用 Particle Photon 制作数字手表 + 闹钟。我正在使用 TFT 屏幕,我在上面绘制了一些数字,我可以使用连接到我的 Photon 的一些按钮来增加和更改“数字索引” - 目的是设置预定警报的时间。下面的函数是我在单击按钮时调用的函数,它的参数是我屏幕上“光标”所在的“数字索引”,我可以用我的按钮导航。然而,这工作正常,一直到 9 - 我的屏幕开始显示 ASCII 笑脸和其他字母而不是数字。我试着放一个 if 语句,当变量 temp 高于 9 时,它被设置为 0 - 这是我最终想要实现的。这不起作用,当超过 9 时它一直显示 ASCII 字母。然后我决定尝试在单击按钮时将 temp 打印到控制台,但是它打印的第一个字母是 49 而不是 0?什么??

我对 C/C++ 不太熟悉,但我确实有一种预感,在我增加 temp 之前,我正在从 char 数组 timeSet 进行转换错误。大家觉得呢?

void replaceDigitFromIndex(int selectorIndex) {
    tft.setTextSize(4);
    tft.setTextColor(ST7735_RED);
    tft.setCursor(4, 20);
    tft.print(timeSet);

    int temp = 0;

    if(selectorIndex == 1) {
        temp = (int) timeSet[0];
        temp++;
        timeSet[0] = (char) temp;
    }

    if(selectorIndex == 2) {
        temp = (int) timeSet[1];
        temp++;
        timeSet[1] = (char) temp;
    }

   if(selectorIndex == 3) {
        temp = (int) timeSet[3];
        temp++;
        timeSet[3] = (char) temp;
   }

   if(selectorIndex == 4) {
        temp = (int) timeSet[4];
        temp++;
        timeSet[4] = (char) temp;
    }

}

【问题讨论】:

  • 没有 C/C++ 语言,它们是两个独立的语言(你似乎在使用 C++,因为你有成员函数)
  • 代表 0 到 9 的字符本身不具有它们所代表的值。在ASCII 中,'0' 字符的数值为 48。
  • 这里的 ASCII 问题的一部分,正如其他人所指出的,我建议您阅读有关类型转换的内容。

标签: c++ embedded


【解决方案1】:

字符'0'-'9'ASCII Characters 48-57*。

如果你想添加一个并让它们循环,你可以这样做:

//conversion to int is implicit, no need for (int)
int temp = timeSet[i] - '0'; //Subtract char '0' to map to ints [0,9]
temp = (temp + 1) % 10; //loop around 10
timeSet[i] = temp + '0'; //Add back char '0' to map back to chars ['0', '9']

*至少对你来说(因为你告诉我们'1' 输出 48,所以你必须使用 ASCII 或 UTF-8 之类的 ASCII 超集),但不能保证每个编译器都会表现得像这。这和可读性是我在代码中使用- '0' 的原因。数字字符始终是连续的。谢谢@Pete!

【讨论】:

  • 形式上,字符 '0' - '9' 是简单的字符,无论编译器使用什么编码。这通常是 ASCII,但也可以是别的东西。但是,对于所有字符编码,转换timeSet[i] - '0' 会将字符值转换为相应的数字值。也就是说,这个答案中的 code 是正确的,尽管解释和 cmets 假定了不需要的东西。
  • 回复:“强制转换为 int 是隐式的”——不,永远不会。强制转换是您在源代码中编写的内容,用于告诉编译器进行转换。演员表总是明确的。这里转换int是隐式的。
  • @PeteBecker 很公平。我从未遇到过不使用 ASCII(或某些超集)的编译器。通过转换也很好地抓住了我的措辞,谢谢!
【解决方案2】:

在 ASCII 中,只有单个字符的表示,特别是对于数字,只有从 0(char 48)到 9(char 57)的数字。 当你超过 9 时,你会得到 char '9'+1 ,即 ':'。 当 int 超过 9 时,你是对的。 但请确保 if 在 int 而不是字符上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多