繁体   English   中英

在C中打印String Arrays的元素时出现奇怪的行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM