在C中打印字符串数组的元素时的奇怪行为

时间:2018-11-29 13:14:36

标签: c arrays

我知道这是一个非常简单的代码,但是在打印数组的元素时,第4个元素将被打印两次,如下所示。

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

2 个答案:

答案 0 :(得分:3)

"Wednesday"需要char[10]来容纳\0字符。

您得到奇怪的行为,因为printf将在输入字符串中搜索\0以停止打印,但是您的"wednesday"没有附加\0字符。

因此printf继续打印,直到打印\0后得到"thursday"

更改此

char days[7][9]

char days[7][10]

const char *days[7] //Compiler automatically adjust the size needed to store string literals.

答案 1 :(得分:0)

这是因为|emp_name|department|ann_leave|med_leave|cas_leave|org_ann_lv|org_med_lv|org_cas_lv| | Tame | IT | | | 3 | | | 25 | | Tame | IT | 4 | | | 20 | | | | Tame | IT | | 3 | | | 30 | | I want the query result like |emp_name|department|ann_leave|med_leave|cas_leave|org_ann_lv|org_med_lv|org_cas_lv| | Tame | IT | 4 | 3 | 3 | 20 | 30 | 25 | 不能包含9个字符。当然,星期三只有9个字母,但是在每个字符串的末尾都带有空终止符,即10个字符。发生的情况是,空终止符会从"Wednesday"T的位置,并且将"Thursday"写入其相应位置时,该空终止符会被覆盖。因此,当您尝试在星期三打印时,为什么两者都在彼此之后打印。它不会在星期三结束时停止,因为下一个空终止符在星期四结束。

要解决此问题,请更改以下内容:

"Thursday"

对此:

char days[7][9] = {

如果您不知道null终止符的工作原理,并且想了解更多信息,可以阅读here