从char到int的转换确实很奇怪

ImS*_*pid 1 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

sco*_*001 5

字符'0'- '9'ASCII字符 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']
Run Code Online (Sandbox Code Playgroud)

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