C语言字符串问题,高手请进,帮我看看,谢谢

以下程序的输出结果是

main()
{
char s[4][4]{“AAAA”,“BBBB”,“CC”,“DD”};

printf("\"%s\"\n",S[1])
}
就是想知道为什么会这样输出????????????? 书上答案是"BBBBCC"啊

书上答案是对的。

s占16个字节,其内容依次是
AAAABBBBCC\0\0DD\0\0 (\0表示内存中1个字节的二进制00000000)

而s[1]等价于 &s[1][0],即第一个字符B的地址。用%s输出时,当然是从B开始,一直在内存里找到\0为止。所以是 BBBBCC

"\"%s\"\n"中有两个\",表示字符串的内容里本身含两个双引号,故输出的完整结果是"BBBBCC"

有人认为"AAAA"末尾会自动加上\0,从而超过了4,不能用来初始化数组s. 这种观点在ANSI C制定之前是正确的。但是,ANSI C有了新的规定:当用双引号字符串去初始化char数组时,允许双引号中的字符个数等于数组大小。这时不会自动在被初始化的数组后面添加\0. 例如 char a[4]="AAAA"是合法的,但a[3](数组的最后一个字节)的下一个字节存放的是什么,则不确定,即strlen(a)是未知的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-03-14
#include <stdio.h>
main()
{
char s[4][5] = {"AAAA","BBBB","CC","DD"};

printf("\"%s\"\n",s[1]);

}
程序应该是这样的,输出"BBBB"。
个人认为:4行5列,s[1]表示第二行就输出"BBBB"了。
第2个回答  2009-03-16
输出为BBBBCC
原因:
1. C语言中,数组各个元素在内存中按行存储,如:s[1]的四个字符后紧接着存储s[2]的字符
2. 数组行宽为4,按理说每一行应该为该行的字符串结束符“\0”留一个位置(会自动填充),但s[1]这一行中4位均为字母“B”,用printf()做字符串的输出是以结束符“\0”标识串的输出结束的,于是输出函数在“BBBB”后继续输出,直至在“CC”后出现了“\0”,此时,输出完毕
第3个回答  2009-03-15
不知道阁下看的是什么书?这么前卫。我2006年学C语言,后面还一直在编些程序,但就是没遇到过char s[4][4]={"AAAA","BBBB","CC","DD"}; 这种定义时初始化也是合法的。

无论从课本上(我学的是科学技术出版社的)学习、还是编译器上(用过TC、VC6.0)调试,我都觉得char s[4][4]={"AAAA","BBBB","CC","DD"}; 是错误的,事实上编译器确实是会报错,这种定义时赋值越界!改为char s[4][5]={"AAAA","BBBB","CC","DD"};这样才是对的。

看了楼上的回答,说是ANSI C有了新的规定,为了学点新知识我特意去查了下:ANSI C就是美国国家标准协会制定的一个C语言的标准,于1983年发表。ANSI C是C语言的标准,任何C语言的编译器都在ANSI C的基础上扩充。照这么说,VC应该支持char s[4][4]={"AAAA","BBBB","CC","DD"}; 这种写法,但是事实上VC不支持!所以还是觉得改为char s[4][5]={"AAAA","BBBB","CC","DD"};才是对的。

char s[4][4]={"AAAA","BBBB","CC","DD"}; 这种写法在VC编译器上真的通不过。char s[4][5]={"AAAA","BBBB","CC","DD"};能通过,printf("\"%s\"\n",s[1]); 输出的是"BBBB" 。因为s[0]、 s[1]、s[2]、s[3]指向的是一行(相当于行指针一样),输出的是一个字符串。 \" 是转义字符,表示的是双引号的一半。所以输出时\" \"对应的是一对双引号。

说到这里,我真有点好奇了,不知阁下看的书是什么书,不会是研究C语言发展,在探讨和改进的吧?
第4个回答  2009-03-14
#include <stdio.h>
void main()
{
char s[4][5] = {"AAAA","BBBB","CC","DD"};

printf("%s\n", s[1]);
}
第5个回答  2009-03-14
BBBBCC
因为输出为遇到'/0'中止
字符串为空,默认赋值'/0'
相似回答