C语言字符串问题

下列程序的输出结果是()。char*p1="abcd",*p2="ABCD",str[50]="xyz";strcpy(str+2,strcat(p1+2,p2+1));... 下列程序的输出结果是( )。
char *p1="abcd", *p2="ABCD", str[50]="xyz";
strcpy(str+2,strcat(p1+2,p2+1));
printf("%s",str);
答案是 xycdBCD。
求详解
展开
 我来答
5922771321
2014-01-08 · TA获得超过1438个赞
知道小有建树答主
回答量:1410
采纳率:100%
帮助的人:362万
展开全部
p1是个指针,是地址,+2就是该地址+2,该地址往后面2个的那个地址 strcat(p1+2,p2+1)的执行:p1=”abcd”,由于p1指向"abcd"的首地址'a'的地址,所以p1+2指向'c'的地址p2=”ABCD”,由于p2指向"ABCD"的首地址'A'的地址,所以p2+1指向'B'的地址所以strcat(p1+2,p2+1)也就是将"cd"和"BCD"进行字符串拼接,得到"cdBCD"再执行strcpy(str+2,"cdBCD")str[50]=”xyz”,由于str指向"xyz"的首地址'x'的地址,所以str+2指向'z'的地址所以,strcpy(str+2,"cdBCD")也就是将"z"用"cdBCD"进行字符串拷贝,拷贝后,原有的以'z'为起始的空间被"cdBCD"覆盖,而前面的"xy"不受影响所以最后输出"xycdBCD"
还有个问题
1 程序不仅有语法错误,而且有严重的逻辑错误,不能运行。strcat(p1+2,p2+1); //p1是指针常值,所指对象不能修改的。2 程序改为下面,才能运行。#include <stdio.h>#include <string.h> void main(){ char p1[50]="abcd", p2[50]="ABCD",str[50]="xyz"; strcpy(str+2,strcat(p1+2,p2+1)); printf("%s",str); }//运行结果是:xycdBCD
xx_lyq00
2014-01-08 · TA获得超过4139个赞
知道大有可为答主
回答量:1794
采纳率:88%
帮助的人:802万
展开全部
strcat这是连接
strcat(p1+2,p2+1) 就是从(p1+2位开始)连接 (p2+1位开始的)字符串

返回值是 p1+2 。
就是 cdBCD

strcpy(str+2,"cdBCD") 这是复制 。从str+2开始复制 ,结果就是 xycdBCD
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冰血无双
2014-01-08 · TA获得超过246个赞
知道小有建树答主
回答量:436
采纳率:100%
帮助的人:321万
展开全部
p1 p2 str 记录的都是字符串的首地址
strcat拼接字符串,
p1位置是‘a’,+2,后移2个 到'c' 得到cd
p2位置是‘A’,+1,后移1个 到'B' 得到BCD
拼接为 cdBCD
strcpy复制字符串
str位置是'x' +2 后移2个 到‘z’位置
从‘z’位置开始复制,cdBCD就替换了“xyz” 从z以后的所有
所有就得 xycdBCD
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-01-08
展开全部
char *p1="abcd", *p2="ABCD", str[50]="xyz";
strcpy(str+2,strcat(p1+2,p2+1));//将p2+1连接到p1+2后面,再拷贝到str+2里面
printf("%s",str);

//p1+2 为cd

//p2+1 为BCD

strcat(p1+2,p2+1) 为 cdBCD

str+2 为z

strcpy(str+2,strcat(p1+2,p2+1))// 为xycdBCD 此处z被覆盖了

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
microroom
科技发烧友

2019-06-10 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:7118
采纳率:83%
帮助的人:1573万
展开全部
1. 字符串初始化,如果逐个赋值的话,系统不一定会自动添加'\0',除非指定了长度且指定的长度大于等于你赋值的字符的个数加1,即最小为你赋值的字符个数加1。假设你指定的字符个数为n,长度为len,则系统会将剩下的(len-n)个元素都赋值为'\0',当n等于len时,不会添加任何'\0'。
之所以出现图1的情况,是因为当前栈顶刚好等于(纯粹是碰巧)'\0',假设当前栈顶为100,则有[100]='\0';,而为m_str分配内存时,栈顶要减4,因为栈设计成了先自减(即分配内存)后入栈,于是[100]='\0';[99]='P';[98]='O';[97]='T';[96]='S';m_str赋值为地址96,当前栈顶为96。当为u_str分配内存时,栈顶又要减4,于是[100]='\0';[99]='P';[98]='O';[97]='T';[96]='S';[95]='P';[94]='O';[93]='T';[92]='S';u_str赋值为地址92,当前栈顶为92。当计算m_str的长度时会从最低96开始,一直计算到99(遇到第一个'\0'前停止),所以m_str的长度为4,同理,计算u_str的长度时会从92开始,一直计算到99,所以其长度为8,从以上分析中显然可以看出,这两个字符串是不相等的,所以strcmp返回-1。
图2就不用过多解释了,手动添加了'\0',输出自然是那样的。又由上面对于图1的解释,要分析出出现图3和图4的原因,也是很容易的了,这里也不解释了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式