static 发表于 2008-8-18 12:51

简单的C语言问题,请教!

#include&nbsp;&quot;stdio.h&quot;<br />#include&nbsp;&quot;conio.h&quot;<br /><br />//函数作用:把字符串S2加在字符串S1的后面并返回新的指针地址<br />char&nbsp;*mme(char&nbsp;*s1&nbsp;,char&nbsp;*s2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s1!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s1++;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s2!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*s1=*s2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s1++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s2++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(s1);<br />}<br /><br />//作用:把b的字符串放在a后面并输出新的字符串内容<br />main()<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*a=&quot;12345&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*b=&quot;abc&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*p=mme(a,b);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s\n&quot;,p);<br />&nbsp;&nbsp;&nbsp;&nbsp;getch();<br />}<br /><br /><br />请问各位:以上函数可以编译通过,但是没有结果;请问错误在哪里?或者如何修改?

xwj 发表于 2008-8-18 13:10

mme(a,b);返回的是加了之后的s1,指向的是字符串之后的结束符

当然就是什么都没有

static 发表于 2008-8-18 13:19

如梦初醒!

楼上认为该如何修改?<br /><br />是不是求出S1字符串的长度L=strlen(s1)之后,再循环L次,返回S1首地址?<br /><br />谢谢!

xinzha 发表于 2008-8-18 13:40

ll

你定义个局部的s3,让s3循环,s1不动不就得了。<br /><br />

static 发表于 2008-8-18 14:02

继续

回楼上,在函数内部后面加上一句:<br /><br />char&nbsp;*s3;<br />.......<br />.......<br />strcpy(s3,s1);<br />return&nbsp;s3;<br /><br />依然未果,继续请教!谢谢

xwj 发表于 2008-8-18 14:32

唉... 建议LZ改行.

static 发表于 2008-8-18 15:00

dd

楼上的知道说一下,这个程序看似简单;其实你未必能找出其中的错误!不行你可以多试几次.....<br /><br />继续顶!

xinzha 发表于 2008-8-18 15:41

ll

别return&nbsp;s3,return&nbsp;s1啊。<br />

wlq_9 发表于 2008-8-18 15:47

估计LZ

习惯了上位机的编程,定义一个字符串都不用去管这个字符串的长度.<br />底层不行.你必段保证s1指向的存储空间能容纳s1+s2的内容.<br />而且还有一个明显的问题:char&nbsp;*a=&quot;abcd&quot;这样a指向的很可能是flash空间,而不是一个内存段,后面再进行*a=*b结果很可能就是数据中止!<br />最安全的做法,应该是先分配一个空间,例如说:char&nbsp;tab1[***];&nbsp;a=&tab1;<br />char&nbsp;tab2[***];&nbsp;b=&tab2,然后再运算即可.

static 发表于 2008-8-18 16:07

谢谢楼上

谢8楼!8楼所言极是,程序编译结果没有错,就是提示内存错误!<br />依据8楼所言,一种办法是可以把a定义为一个大数组解决内存溢出的问题,另外是否可用下面的方法?<br /><br />#include&nbsp;&quot;stdio.h&quot;<br />#include&nbsp;&quot;conio.h&quot;<br /><br />//返回新的指针地址,指向s1+s2后的内容<br />char&nbsp;*mme(char&nbsp;*s1&nbsp;,char&nbsp;*s2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*p=(char&nbsp;*)malloc(strlen(s1)+strlen(s2));<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*s_addr=p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//暂时保存p的起始地址;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s1!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p++=*s1++;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s2!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p++=*s2++;<br />&nbsp;&nbsp;&nbsp;&nbsp;p=pp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回首地址<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(p);<br />}<br /><br />main()<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*a=&quot;12345&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*b=&quot;abc&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*p=mme(a,b);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s\n&quot;,p);<br />&nbsp;&nbsp;&nbsp;&nbsp;free(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;getch();<br />}<br /><br />此方法程序编译通过输出结果正确之外还有一些乱码,不知道还没有其他好的解决办法?<br /><br />谢谢各位....

static 发表于 2008-8-18 16:13

谢谢

回9楼,返回s1是不行的,程序编译报错,并指出内存错误,可能是内存溢出;<br />再者9楼也犯了2楼所说的错误....<br /><br />小问题,大家可以自试试看!

static 发表于 2008-8-18 16:23

谢谢

根据10楼的方法是不是要在所有定义变量前加上&nbsp;char&nbsp;data&nbsp;a=&quot;12345&quot;&nbsp;?<br /><br />还有没有其他更好的解决办法?<br /><br />1:定义大数组<br />2:使用动态内存分配<br />3:????

hanslong 发表于 2008-8-18 17:32

re

上面的程序应该是有两个主要错误的,一个就是前面所返回的s1的问题,第二个是和编译生成代码有关的,c程序里的字符串常量是不能往里写的,它们好像被放在数据段里的吧

xinzha 发表于 2008-8-18 17:51

ll

乱码的原因是最后没有\0,打印代码会一直打下去直到找到\0。

1dqmoon 发表于 2008-8-18 21:53

11楼的程序都无法编译

怎么多了个pp?<br /><br />malloc后最好判断一下是否申请到了内存,&nbsp;否则执行下去还是错的

zjj2k 发表于 2008-8-19 09:42

这是c初学者最易范的错误

这是c初学者最易范的常识性错误,楼上有人说出了问题的要点。

static 发表于 2008-8-19 21:43

DD

这个问题最要注意的就是内存溢出问题!

korking 发表于 2008-8-19 22:11

一起进步

char&nbsp;*mme(char&nbsp;*s1&nbsp;,char&nbsp;*s2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*p=(char&nbsp;*)malloc(strlen(s1)+strlen(s2));<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*s_addr=p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//暂时保存p的起始地址;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s1!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p++=*s1++;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s2!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p++=*s2++;<br />&nbsp;&nbsp;&nbsp;&nbsp;p=pp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回首地址<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(p);<br />}<br />把你的代码在linux下用GCC调试了一下<br />p=pp ??哪来的PP?这也能运行出结果?<br />挂掉PP后,运行,也是提示段错误

icmap 发表于 2008-8-19 22:24

1:用错指针 2:你没理解局部变量的生存期

1楼用错指针。<br /><br />你怎么知道字符串&quot;12345&quot;的后面就一定是空闲空间?居然修改其后面的内容,这很有可能会把其它内容冲掉。<br /><br />11楼是没理解局部变量的生存期<br />在函数&nbsp;mme&nbsp;结束后,指针&nbsp;p&nbsp;所指向的内存已经被释放了,有乱码也就不奇怪了。<br /><br />楼主还是赶紧吧指针、内存和局部变量的知识理解透彻吧,否则有得你搞的。<br /><br />建议改为如下内容:<br /><br />#include&nbsp;&quot;stdio.h&quot;<br />#include&nbsp;&quot;conio.h&quot;<br /><br />//返回新的指针地址,指向s1+s2后的内容<br />void&nbsp;mme(char&nbsp;*s1,&nbsp;char&nbsp;*s2,&nbsp;char&nbsp;*p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s1!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p++=*s1++;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s2!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p++=*s2++;<br />&nbsp;&nbsp;&nbsp;&nbsp;*p='\0';<br />}<br /><br />main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*a=&quot;12345&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*b=&quot;abc&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*p=(char&nbsp;*)malloc(strlen(a)+strlen(b)+1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mme(a,b,p);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s\n&quot;,p);<br />&nbsp;&nbsp;&nbsp;&nbsp;free(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;getch();<br />}<br />

korking 发表于 2008-8-19 22:43

稍微的改了一点

#include&nbsp;&quot;stdio.h&quot;<br />//#include&nbsp;&quot;conio.h&quot;  LINUX下没找着这个头文件<br />#include&nbsp;&quot;stdlib.h&quot;<br />#include&nbsp;&quot;string.h&quot;<br /><br />char&nbsp;*mme(char&nbsp;*s1&nbsp;,char&nbsp;*s2,char&nbsp;*s3)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s1!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*s3=*s1;  //把值附给S3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s1++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s3++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s2!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*s3=*s2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s2++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s3++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />  return&nbsp;(s3);<br />}<br /><br />main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*a=&quot;12345&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*c=(char&nbsp;*)malloc(strlen(a));<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*b=&quot;abc&quot;;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mme(a,b,c);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s\n&quot;,c);<br />&nbsp;&nbsp;&nbsp;&nbsp;free(c);<br />}<br /><br />把你最初的稍微的改了下,添加了一个字符指针变量C,把A,B的值都塞入C中<br />&nbsp;&nbsp;&nbsp;while(*s1!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p++=*s1++;  //跳出循环后,S1已经指到'\0',在往后面添加,就会            造成溢出,从而出现段错误<br />&nbsp;&nbsp;&nbsp;&nbsp;while(*s2!='\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p++=*s2++;<br />LINUX下,编译,运行都没问题,你可以试试
页: [1] 2
查看完整版本: 简单的C语言问题,请教!