为什么 Serial.println(<char[]>);返回随机字符?

Why Does Serial.println(<char[]>); Return Random Characters?

本文关键字:gt 返回 随机 字符 char println Serial lt 为什么      更新时间:2023-10-16

我正绞尽脑汁想解决这个问题。对于初学者:*我的包价是9600英镑。*我有一个8大小的数组,所以最大索引是7*我根据时间将数组中的每个字符(位置0,1,3,4,6,7(设置为数字0-9*如果我打印时间,它会完美地显示出来,除非数字在18:00:00以上*MSin1Hr、MSin24Hr等的const longs是全局声明的以下是从MS到字符串的时间代码

char lightOffTime[] = {'0', '0', ':', '0', '0', ':', '0', '0'};
void getTimeStr(char inArr[], unsigned long timeInMS)
{
int num = 0;
char cstr[16];
num = timeInMS / (10 * MSin1Hr); //tens of hours
sprintf(cstr, "%01d", num);
inArr[0] = cstr[0];
num = timeInMS % (10 * MSin1Hr) / MSin1Hr; //remainder
sprintf(cstr, "%01d", num);
inArr[1] = cstr[0];
unsigned long minutesMS = timeInMS % MSin1Hr;
num = minutesMS / (10 * MSin1Minute); //tens of minutes
sprintf(cstr, "%01d", num);
inArr[3] = cstr[0];
num = minutesMS % (10 * MSin1Minute) / MSin1Minute; //remainder
sprintf(cstr, "%01d", num);
inArr[4] = cstr[0];
unsigned long secondsMS = timeInMS % MSin1Minute;
num = secondsMS / 10000; //tens of seconds
sprintf(cstr, "%01d", num);
inArr[6] = cstr[0];
num = (secondsMS % 10000) / 1000; //remainder
sprintf(cstr, "%01d", num);
inArr[7] = cstr[0];
}

我使用调用函数

getTimeStr(lightOffTime, lightTurnOffTime);

然后我可以使用Serial.println(lightOffTime);将其打印到串行

正如你所看到的,我只是在MS中输入数组和时间,它应该以格式化字符串的形式弹出时间。有什么想法吗-我传入的具体号码是68401000(19:00:01(,由于某种原因,它正在打印19:00:01h

您必须在字符串的末尾有一个null终止符来告诉打印函数在哪里停止打印。很可能只是碰巧,内存中的下一个点恰好有一个0,直到你得到那个特定的数字,无论出于什么原因,在这种情况下,内存中数组的后面会有一个h,然后很明显,在那之后会有0,因为它停在了那里。

因此,它与其他数字一起工作只是一种侥幸。有时bug就是这样,你会犯一个错误,无论出于什么原因,在某些情况下它看起来都很好。这就是从数组末尾跑出来的本质。他们称之为"未定义行为",因为当你这样做时,无法预测会发生什么。