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。
求详解 展开
char *p1="abcd", *p2="ABCD", str[50]="xyz";
strcpy(str+2,strcat(p1+2,p2+1));
printf("%s",str);
答案是 xycdBCD。
求详解 展开
5个回答
展开全部
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
还有个问题
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
展开全部
strcat这是连接
strcat(p1+2,p2+1) 就是从(p1+2位开始)连接 (p2+1位开始的)字符串
返回值是 p1+2 。
就是 cdBCD
strcpy(str+2,"cdBCD") 这是复制 。从str+2开始复制 ,结果就是 xycdBCD
strcat(p1+2,p2+1) 就是从(p1+2位开始)连接 (p2+1位开始的)字符串
返回值是 p1+2 。
就是 cdBCD
strcpy(str+2,"cdBCD") 这是复制 。从str+2开始复制 ,结果就是 xycdBCD
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
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被覆盖了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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的原因,也是很容易的了,这里也不解释了。
之所以出现图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的原因,也是很容易的了,这里也不解释了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询