永发信息网

C中关于strcpy函数和二维数组的问题。

答案:3  悬赏:10  手机版
解决时间 2021-02-14 02:44
  • 提问者网友:爱了却不能说
  • 2021-02-13 11:32
#include<stdio.h>
main()
{
char arr[2][4];
strcpy(arr,"you");
strcpy(arr[1],"me");
arr[0][3]='&';
printf("%s\n",arr);
}
为什么运行结果是you&me,显示了第二行的数据

#include<stdio.h>
main()
{
char arr[2][4]={"jinqwert"};
printf("%s\n",arr);
}
运行出来的结果是jinq,没有显示第二行的数据呢?
最佳答案
  • 五星知识达人网友:孤独的牧羊人
  • 2021-02-13 12:38
问题产生的原因较为复杂,希望我的耐心回答不会换来您的反感。

首先看程序1.
第一行:
char arr[2][4];
您定义了两个字符数组,每个字符数组有四个长度。所以这2个字符数组就有8个长度,很有意思的是,这8个长度的字符是在内存中连续排布的。也就是说,排在字符数组arr[0]的最后一个字符arr[0][3]后面的是arr[1][0],这个您可明白?
第二行:
strcpy(arr,"you");
是尝试将you这个字符串赋值到arr中去,对吧。那么请您回答一下是复制到arr[0]去还是赋值到arr[1]去?还是复制到arr去?
其实这里是复制到arr[0]去,而arr[0]就等于arr,都为起始地址嘛!
复制了几个字符?
4个
一个是y,然后是o,然后是u,然后是……'\0',表示字符串的末尾。
printf函数在输出字符数组的时候就会去寻找这个字符,将之前的全部输出,到'\0'结束。而程序的第四行
arr[0][3]='&';
将该位置由'\0'改成了'&'导致print函数认为字符串尚未结束,结果就去读arr[0][3]之后的字符,刚才讲过,两个字符串数组在内存中连续存放,使得printf函数读到了arr[1][0],最后读到了'\0'才结束了,也就是说,arr[0][3]='&';这一步使得两个字符串的分界点得到破坏……就造成了在一行中输出了两行内容的效果。
而在第二个程序中,您使用了大括号来给字符数组的数组进行赋值,由于大括号内仅有一对双引号,所以就赋值给了第一个数组,也就是arr[0],但是,arr[0]是一个数组,数组的长度仅仅为4,可是您却将一个"jinqwert"这么老长的字符数组给它,它能接得了吗,它接不了,接不住怎么办?丢弃……不过我现在怀疑 您能不能通过编译……
全部回答
  • 1楼网友:青灯有味
  • 2021-02-13 14:12
个人理解是 字符数组 与 整数/实数数组 初始化的区别。 二维字符数组的初始化 是对各个字符串分别进行初始化。 如果用: char arr[2][4]; strcpy(arr, "123456789"); 其内部的排列是跟 整数/实数数组 一样的。 这应该也是 多维字符数组 初始化 与 赋值 是有区别的。 而整数/实数数组的 初始化 与 赋值 效果是一样的。
  • 2楼网友:洎扰庸人
  • 2021-02-13 13:43
可以的,二维数组本身就是由多个一维数组组成的,对二维数组其中的一维数组分别使用strcpy即可: #include  using namespace std; void main() { char* str = "hello world!"; char arr[100][100]; strcpy(arr[0], str); cout< using namespace std; void main() { char* str = "hello world!"; char arr[100][100]; memcpy(arr,str,13); cout<
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯