c语言小小小小小小小小小小小小小问题?

来源:百度知道 编辑:UC知道 时间:2024/07/03 04:03:24
以下打印的为什么不是:abcde
abcde
abcde
abcde
abcde

#include <stdio.h>
main()
{
int i;
char c[5][5]={"abcde","abcde","abcde","abcde","abcde"};
printf("----------------\n");
for(i=0;i<5;i++)
puts(c[i]);
}
嗯 是的 我刚也发现了,把‘\0’给挤掉了。但是为什么它还是可以停下来呢,把整个二维数组输完就停了,这最后并没有‘\0’啊?
wuhouzheng:遇到随机值为‘\0’,也就是说到这二维数组末尾正好有个‘\0’不?这是偶然的?

1、char c[5][5]={"abcde","abcde","abcde","abcde","abcde"};
数组的定义和初始化来看,数组中没有‘\0’,不是字符串。
2、puts(c[i]); 函数功能为输出字符串,要求提供字符串首地址,从首地址开始输出字符,直到遇到‘\0’停止输出。
在输出过程中没有边界,把整个二维数组输完后,继续输出,直到遇到随机值为‘\0’停止输出。

修改:

char c[5][6]={"abcde","abcde","abcde","abcde","abcde"};

"abcde"字符串要加上结束符:'\0',长度是6.

"abcde"这样的表达,默认后面有'\0'
所以数组c应该改成c[5][6],否则会报数组越界

应为内存里默认存的就是0,你没给它赋值,它就是默认的0

数组越界了…

字符串默认最后接一个0,"abcde"长度为6,不是5,所以定义的时候是char c[5][6],像你那样定义,按照严谨的编译器来说 它是会报错或警告的

#include <stdio.h>
int main()
{
int i;
char c[5][6]={"abcde","abcde","abcde","abcde","abcde"};
printf("----------------\n");
for(i=0;i<5;i++)
puts(c[i]);
return 0;
}