迭代二维字符数组时打印值错误
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/
我正在尝试 运行 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/