C语言大大的疑问.为什么这两个程序输出是这样

来源:百度知道 编辑:UC知道 时间:2024/07/02 04:20:56
main()
{ char *p1,*p2,str[50]="xyz" ;
p1="abcd";
p2="ABCD";
strcpy(str+2,strcat(p1+2,p2+1));
printf("%s",str);
}
输出是xycdBCD

main()
{ char *p1,*p2,str[50]="xyz" ;
p1="abc";
p2="ABC";
strcpy(str+3,p2);
strcat(str+2,p1);
printf("%s",str);
}
输出却是xyzABCabc
疑问:
有人和我(对第二个程序)说strcat 不关心从哪里开始。
它的第一个参数只是提供一个地址,然后从这个地址开始寻找,直到它找到一个'\0'。
然后它把它第二个参数指向的字符串粘贴到'\0'的位置,然后再在这个字符串后边添加一个'\0'。
也就是说,不论你执行
strcat(str+2,p1);
还是strcat(str+3,p1);strcat(str,p1);
结果都是一样的

那照这么说第一个程序应该输出xyabcdBCD 才对啊 不管是不是从p1+2开始(对第一个程序)

你被误导了

我都没话讲了,
你的这个程序不死才怪。

还想要输出结果?

修改const 常量字符串?
my god.

事实上第一题strcpy(str+2,strcat(p1+2,p2+1)); 这个语句中的
strcat(p1+2,p2+1)的返回值是cdBCD,所以放到整个语句中,当然是
输出xycdBCD。
可以这样试试:
#include <stdio.h>
#include <string.h>
void main()
{ char *p1,*p2;
char str1[5]="abcd";
char str2[5]="ABCD";
char str[50]="xyz" ;

p1=str1;
p2=str2;
p1=strcat(p1+2,p2+1);
printf("%s\n",p1);
strcpy(str+2,p1);
printf("%s",str);
}

你实在很幸运!!!!

你修改了串常量"p1+2"却还能运行--
strcat(char *s1, const char *s2)的第一个参数s1必须为数组或数组的一部分,而且还要能装得下s2和目前的s1。

用指针引用字符串是要用const指针定义,如const char* pstr = "Hello"

你的定义并没有错误!
你只需要明白下面这个小程序,你的问题就可以解决了!
“strcat 不关心从哪里开始”按我个人理解,这句话是错误的!
#include <stdio.h>
void main()
{
char *p;
p="AB