帮忙看一下这个c程序输出结果,谢谢!

来源:百度知道 编辑:UC知道 时间:2024/05/29 18:03:18
程序并不是很烦琐
我马上参加考试
时间紧迫
敬请高首赐教!!
(答案满意必追加分数!!)

#include<stdio.h>
#include<string.h>
void main()
{
char strlist[3][5]={'\0'};
strcpy(strlist[1],"write--");
strcpy(strlist[2],"here");
printf("%s%s%s\n",strlist[0],strlist[1],strlist[2]);
}

这个结果应该是什么?
参考答案:writeherehere
我实在是不明白为什么两个here
还有就是像上面这个程序中的:如果一个字符串是strlist={‘\0’},在输出的时候,他是什么都不输出还是输出五个空格?
神之雷藏(??)
谢谢你的关注
除了你提到的运行到第二个strcpy的地方,为什么会影响到strlist[1]的值外,还有个问题就是为什么运行strcpy(strlist[1],"write--"); 时
strlist[1]的值是write--
strlist[2]的值是--
字符数组的长度不是5吗?怎么会变成7,而且第二个数组怎么会受影响?

strcpy的参数解释(MSDN)
char *strcpy(
char *strDestination,
const char *strSource
);
strDestination:Destination string.
strSource:Null-terminated source string.

当声明:
char strlist[3][5]={'\0'};
实际上三个字符串strlist[0]到strlist[2],是连续存放的。


strcpy(strlist[1],"write--");
按"write--"全数拷到了strlist[1]及其后的两个字节。
虽然strlist[1]只有5个字符长,但strlist[1]只是代表着字符串1的起址。倘若注释掉随后的语句,只printf("%s",strlist[1]),可以看到输出
"write--",因为字符串的结束是以遇到'\0'为条件。


strcpy(strlist[2],"here");
strlist[1]的串结束点为strlist[2]的串结束点。
此时:
strlist[1]="writehere\0";
strlist[2]="here\0";

实际上,在VS2005里,越界的strcpy会被编译器指示出来,它会提示使用strcpy_s代替。

首先,二维数组的存储方式也是连续的,char strlist[3][5]={'\0'}; 在栈中是一块15字节的连续空间,相当于char strlist[15],索引的方式是a[m][n] = a[m * n + n](从0开始)。然后,strcpy是从源字符串开始向目的复制,直到'\0',strcpy(s