我试图从我的Arduino上的结构数组中输出一个随机元素。结构看起来像这样
struct questionStructure {
char question[7];
int answer;
};
我在循环中调用一个方法,其中包含一堆带有答案的问题,然后应该选择一个随机问题并显示在显示屏上。该方法看起来像这样
bool questionIsShown = false;
void randomQuestion()
{
int random;
struct questionStructure problems[4];
char test[7];
strcpy(test, "49 x 27");
strcpy(problems[0].question, test);
problems[0].answer = 1323;
strcpy(test, "31 x 35");
strcpy(problems[1].question, test);
problems[1].answer = 1085;
strcpy(test, "47 x 37");
strcpy(problems[2].question, test);
problems[2].answer = 1739;
strcpy(test, "46 x 15");
strcpy(problems[3].question, test);
problems[3].answer = 690;
strcpy(test, "24 x 29");
strcpy(problems[4].question, test);
problems[4].answer = 696;
if(questionIsShown==false) {
random = rand() % 4 + 0;
lcd.setCursor(0,1);
lcd.print(problems[random].question);
questionIsShown=true;
}
我不确定我做错了什么,但即使代替上面的使用lcd.print(problems[0].question);
,显示屏也会显示结构数组中的多个问题。例如,如上所示,显示屏显示49 x 27+X31 x 35
< - 其中X是一些奇怪的符号。
我做错了什么?
答案 0 :(得分:2)
C / C ++将字符串读取为以null终止符结尾。
在您的情况下,您已将内容复制到一个字符串缓冲区中,该字符串缓冲区仅足以保存您的内容,但不会保留空终止符,因此显示操作会认为该字符串仍在继续。
在这种情况下,由于问题和答案位于记忆的连续部分,这意味着它包含下一个问题和答案。
有几种方法可以解决这个问题:
strncpy
)将数据加载到缓冲区中。答案 1 :(得分:2)
您正在溢出内存缓冲区test
和question
。它们的长度应为8个字符而不是7个字符(0个终止字符串的空格)。尝试:
struct questionStructure {
char question[8];
int answer;
};
和char test[8];