迭代二维字符数组时打印值错误

Wrong print values while iterating 2d char array

我正在尝试 运行 Arduino IDE 中的这段代码。它正在打印错误的值。

char daysOfTheWeek[7][4] = {"Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"};

for(int i=0;i<7;i++) {
    Serial.print(daysOfTheWeek[i]);
    Serial.print(" ");
}

Serial.println();

印刷值

Sun Mon TuesWed Wed ThurFri Fri Sat

我看到这可以通过如下更改数组分配来解决

char *daysOfTheWeek[7] = {"Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"};

我是 c++ 的新手。谁能帮我理解为什么会这样?

所有字符串文字的末尾都有一个隐含的 null-terminator。所以,最大的 "Tues""Thur" 实际上包含 5 个字符,例如:"Tues[=12=]""Thur[=13 =]".

因此,要么需要将字符数组的维数增加到[5](导致char daysOfTheWeek[7][5]),要么需要使用"Tue""Thu"作为初始值设定项。

当您尝试以这种方式打印 daysOfTheWeek 的内容时,您使用 Serial.print() returns the number of bytes written 的事实可能是图形化的。

同时,例如,在 g++ 编译器中,您的代码应该给出错误:error: initializer-string for array of chars is too long,指向上面提到的两个有问题的字符串文字。

至于 Arduino 部分,您可能要考虑使用 String 库类型。

这是因为数组的第二个维度比最长的词短。

该代码将第二个维度设置为最多 4。因此每个打印语句将最多打印 4 个字符。附加到每个单词的空字符计为一个。因此,诸如“Mon”之类的单词将正确打印(单词 3 个字符 + 空值 1 个字符)。像“Thur”这样较长的词将在没有空字符的情况下打印出来,所以你会看到“Thur”和“Fri”背靠背,就像在“ThurFri”中一样。要解决这种情况,请增加数组的第二个维度!

第二个选项使用编译器自动知道单词长度的指针,因此打印将是正确的。

有更多方法可以做到这一点,您可以在这里阅读: https://www.geeksforgeeks.org/array-strings-c-3-different-ways-create/