从char转换为int做了一些奇怪的事情

时间:2018-03-22 18:34:00

标签: c++ embedded

我正在使用粒子光子制作数字手表+闹钟。我正在使用一个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;
    }

}

2 个答案:

答案 0 :(得分:5)

字符'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!

答案 1 :(得分:2)

在ASCII中,只有单个字符的表示,特别是对于数字,只有0(char 48)到9(char 57)的数字。 当你超过9岁时,你将获得#9;' +1' +1。'。 你是正确的,当int超过9时,为if语句。 但要确保if是在int而不是字符。