[英]Strange behaviour when printing elements of String Arrays in C
我知道这是一个非常简单的代码,但是当打印数组的元素时,第四个元素被打印两次,如下图所示。
void printWeekDays(){
char days[7][9] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
for(int i=0; i < 7; i++){
printf("%s \n",days[i]);
}
星期一
星期二
星期三星期四
星期四
星期五
星期六
星期日
这是我的环境:Apple LLVM 10.0.0版(clang-1000.11.45.5)
目标:x86_64-apple-darwin17.7.0
"Wednesday"
需要char[10]
来保存\\0
char。
你得到奇怪的行为因为printf
将在输入字符串中搜索\\0
以停止打印,但你的"wednesday"
没有附加\\0
字符。
因此, printf
继续打印,直到它在"thursday"
打印后得到\\0
。
改变这个
char days[7][9]
至
char days[7][10]
要么
const char *days[7] //Compiler automatically adjust the size needed to store string literals.
这是因为"Wednesday"
不适合9个字符的数组。 当然,星期三只有9个字母,但是每个字符串末尾的空终止符都是10个字符。 发生的事情是null terinator从"Thursday"
到达T
地方,当"Thursday"
被写入其相应的位置时,该null终止符被覆盖。 因此,当你试图在星期三打印时,为什么两个都会在彼此之后打印。 它不会在星期三结束时停止,因为下一个空终止符是在星期四结束。
要修复它,请更改:
char days[7][9] = {
对此:
char days[7][10] = {
如果您不知道null终结符的工作原理并希望了解更多信息,可以在此处阅读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.