当前位置: 代码迷 >> C语言 >> [讨论]两个程序的差别, 搞笑!
  详细解决方案

[讨论]两个程序的差别, 搞笑!

热度:154   发布时间:2007-07-29 20:51:52.0
[讨论]两个程序的差别, 搞笑!

两个程序均想实现字符连接功能,第一个函数输出为:fdsaqwerfdsa,第二个输出正确,结果是qwerfdsa

请问,程序1错在何处?

程序1

char stringcat(char *str1,char *str2)
{
int c=strlen(str1);
for(;*(str1+c)=*str2,*str2!='\0';str1++,str2++)
;

printf("%s",str1);
}

void main()
{char *s1,temp[50]="qwer";
char *s2="fdsa";
s1=temp;
printf("%s",s1);puts("\n");
printf("%s",s2);puts("\n");
s1=temp;
stringcat(s1,s2);
printf("%s",s1);
puts("\n");
getch();
}


程序2

char strcat1(char *str1,char *str2)
{
while(*str1!='\0')
str1++;
for(;*str1=*str2;str1++,str2++);
return *str1;
}

void main()
{char *s1,temp[50]="qwer";
char *s2="fdsa";
s1=temp;
printf("%s",s1);puts("\n");
printf("%s",s2);puts("\n");
s1=temp;
stringcat(s1,s2);
printf("%s",s1);
puts("\n");
getch();
}


搜索更多相关的解决方案: 搞笑  

----------------解决方案--------------------------------------------------------

对了我的环境是win-tc 1.91


----------------解决方案--------------------------------------------------------

oh my Holy God!i am so sorry,the code is right!


----------------解决方案--------------------------------------------------------

#include<string.h>
#include<stdio.h>
char stringcat(char *str1,char *str2)
{
int c=strlen(str1);
for(;*(str1+c)=*str2,*str2!='\0';str1++,str2++)
;

/* 输出了两次(函数执行完后还有一次printf),去掉此处即可 printf("%s",str1); */
}


int main(void)
{
char *s1,temp[50]="qwer";
char *s2="fdsa";
s1=temp;
printf("%s",s1);puts("\n");
printf("%s",s2);puts("\n");
/* 不用写两遍 s1=temp; */
stringcat(s1,s2);
printf("%s",s1);
puts("\n");
getch();
return 0;
}


----------------解决方案--------------------------------------------------------
回复:(卧龙孔明)#include#include...
为什么多写一次就会得出错误的结果???
----------------解决方案--------------------------------------------------------

这样也应该可以:
char stringcat(char *str1,char *str2)
{
/* char *ps=str1;*/
int c=strlen(str1);
for(;*(str1+c)=*str2,*str2!='\0';str1++,str2++)
;

return str1-c;/* return ps; */
}


void main()
{char *s1,temp[50]="qwer";
char *s2="fdsa";
s1=temp;
printf("%s",s1);puts("\n");
printf("%s",s2);puts("\n");
s1=stringcat(s1,s2);
printf("%s",s1);
puts("\n");
getch();
}

[此贴子已经被作者于2007-7-30 9:52:26编辑过]


----------------解决方案--------------------------------------------------------
以下是引用anelwl在2007-7-30 9:39:34的发言:
为什么多写一次就会得出错误的结果???

多写一次本质是无误的,但是多写一次printf就与真正应输出的数据不同了(因为输出了两次)


----------------解决方案--------------------------------------------------------

我知道了:
char stringcat(char *str1,char *str2)
{
int c=strlen(str1);
for(;*(str1+c)=*str2,*str2!='\0';str1++,str2++)
;

printf("%s",str1);/*这里str1的地址其实已经指向了str2,因此输出为str2的字符串 */
}


void main()
{char *s1,temp[50]="qwer";
char *s2="fdsa";
s1=temp;
printf("%s",s1);puts("\n");
printf("%s",s2);puts("\n");
s1=temp;
stringcat(s1,s2);/*调用函数,输出s2的字符串*/
printf("%s",s1);/*这才是拷贝后的字符串*/
puts("\n");
getch();
}


----------------解决方案--------------------------------------------------------
以下是引用anelwl在2007-7-30 10:56:34的发言:

我知道了:
char stringcat(char *str1,char *str2)
{
int c=strlen(str1);
for(;*(str1+c)=*str2,*str2!='\0';str1++,str2++)
;

printf("%s",str1);/*这里str1的地址其实已经指向了str2,因此输出为str2的字符串 */
}


void main()
{char *s1,temp[50]="qwer";
char *s2="fdsa";
s1=temp;
printf("%s",s1);puts("\n");
printf("%s",s2);puts("\n");
s1=temp;
stringcat(s1,s2);/*调用函数,输出s2的字符串*/
printf("%s",s1);/*这才是拷贝后的字符串*/
puts("\n");
getch();
}

你说的不对,str1没有指向str2,错在str1当时已经指向初始地址+c了。


----------------解决方案--------------------------------------------------------
以下是引用jianweichief在2007-7-30 20:14:59的发言:

你说的不对,str1没有指向str2,错在str1当时已经指向初始地址+c了。

提两点建议:
(1)此时的str1 = str1 + strlen(str2);
(2)返回值最好返回最初的str1,类型为char*,而不要返回char


----------------解决方案--------------------------------------------------------
  相关解决方案