简单的C语言问题,请教!
#include "stdio.h"<br />#include "conio.h"<br /><br />//函数作用:把字符串S2加在字符串S1的后面并返回新的指针地址<br />char *mme(char *s1 ,char *s2)<br />{<br /> while(*s1!='\0')<br /> s1++;<br /> while(*s2!='\0')<br /> {<br /> *s1=*s2;<br /> s1++;<br /> s2++;<br /> }<br /> return (s1);<br />}<br /><br />//作用:把b的字符串放在a后面并输出新的字符串内容<br />main()<br />{<br /><br /> char *a="12345";<br /> char *b="abc";<br /> char *p=mme(a,b);<br /> printf("%s\n",p);<br /> getch();<br />}<br /><br /><br />请问各位:以上函数可以编译通过,但是没有结果;请问错误在哪里?或者如何修改?mme(a,b);返回的是加了之后的s1,指向的是字符串之后的结束符
当然就是什么都没有如梦初醒!
楼上认为该如何修改?<br /><br />是不是求出S1字符串的长度L=strlen(s1)之后,再循环L次,返回S1首地址?<br /><br />谢谢!ll
你定义个局部的s3,让s3循环,s1不动不就得了。<br /><br />继续
回楼上,在函数内部后面加上一句:<br /><br />char *s3;<br />.......<br />.......<br />strcpy(s3,s1);<br />return s3;<br /><br />依然未果,继续请教!谢谢唉... 建议LZ改行.
dd
楼上的知道说一下,这个程序看似简单;其实你未必能找出其中的错误!不行你可以多试几次.....<br /><br />继续顶!ll
别return s3,return s1啊。<br />估计LZ
习惯了上位机的编程,定义一个字符串都不用去管这个字符串的长度.<br />底层不行.你必段保证s1指向的存储空间能容纳s1+s2的内容.<br />而且还有一个明显的问题:char *a="abcd"这样a指向的很可能是flash空间,而不是一个内存段,后面再进行*a=*b结果很可能就是数据中止!<br />最安全的做法,应该是先分配一个空间,例如说:char tab1[***]; a=&tab1;<br />char tab2[***]; b=&tab2,然后再运算即可.谢谢楼上
谢8楼!8楼所言极是,程序编译结果没有错,就是提示内存错误!<br />依据8楼所言,一种办法是可以把a定义为一个大数组解决内存溢出的问题,另外是否可用下面的方法?<br /><br />#include "stdio.h"<br />#include "conio.h"<br /><br />//返回新的指针地址,指向s1+s2后的内容<br />char *mme(char *s1 ,char *s2)<br />{<br /> char *p=(char *)malloc(strlen(s1)+strlen(s2));<br /> char *s_addr=p; //暂时保存p的起始地址;<br /> while(*s1!='\0')<br /> *p++=*s1++;<br /> while(*s2!='\0')<br /> *p++=*s2++;<br /> p=pp; //返回首地址<br /> return (p);<br />}<br /><br />main()<br />{<br /><br /> char *a="12345";<br /> char *b="abc";<br /> char *p=mme(a,b);<br /> printf("%s\n",p);<br /> free(p);<br /> getch();<br />}<br /><br />此方法程序编译通过输出结果正确之外还有一些乱码,不知道还没有其他好的解决办法?<br /><br />谢谢各位....谢谢
回9楼,返回s1是不行的,程序编译报错,并指出内存错误,可能是内存溢出;<br />再者9楼也犯了2楼所说的错误....<br /><br />小问题,大家可以自试试看!谢谢
根据10楼的方法是不是要在所有定义变量前加上 char data a="12345" ?<br /><br />还有没有其他更好的解决办法?<br /><br />1:定义大数组<br />2:使用动态内存分配<br />3:????re
上面的程序应该是有两个主要错误的,一个就是前面所返回的s1的问题,第二个是和编译生成代码有关的,c程序里的字符串常量是不能往里写的,它们好像被放在数据段里的吧ll
乱码的原因是最后没有\0,打印代码会一直打下去直到找到\0。11楼的程序都无法编译
怎么多了个pp?<br /><br />malloc后最好判断一下是否申请到了内存, 否则执行下去还是错的这是c初学者最易范的错误
这是c初学者最易范的常识性错误,楼上有人说出了问题的要点。DD
这个问题最要注意的就是内存溢出问题!一起进步
char *mme(char *s1 ,char *s2)<br />{<br /> char *p=(char *)malloc(strlen(s1)+strlen(s2));<br /> char *s_addr=p; //暂时保存p的起始地址;<br /> while(*s1!='\0')<br /> *p++=*s1++;<br /> while(*s2!='\0')<br /> *p++=*s2++;<br /> p=pp; //返回首地址<br /> return (p);<br />}<br />把你的代码在linux下用GCC调试了一下<br />p=pp ??哪来的PP?这也能运行出结果?<br />挂掉PP后,运行,也是提示段错误1:用错指针 2:你没理解局部变量的生存期
1楼用错指针。<br /><br />你怎么知道字符串"12345"的后面就一定是空闲空间?居然修改其后面的内容,这很有可能会把其它内容冲掉。<br /><br />11楼是没理解局部变量的生存期<br />在函数 mme 结束后,指针 p 所指向的内存已经被释放了,有乱码也就不奇怪了。<br /><br />楼主还是赶紧吧指针、内存和局部变量的知识理解透彻吧,否则有得你搞的。<br /><br />建议改为如下内容:<br /><br />#include "stdio.h"<br />#include "conio.h"<br /><br />//返回新的指针地址,指向s1+s2后的内容<br />void mme(char *s1, char *s2, char *p)<br />{<br /> while(*s1!='\0')<br /> *p++=*s1++;<br /> while(*s2!='\0')<br /> *p++=*s2++;<br /> *p='\0';<br />}<br /><br />main()<br />{<br /> char *a="12345";<br /> char *b="abc";<br /> char *p=(char *)malloc(strlen(a)+strlen(b)+1);<br /><br /> mme(a,b,p);<br /> printf("%s\n",p);<br /> free(p);<br /> getch();<br />}<br />稍微的改了一点
#include "stdio.h"<br />//#include "conio.h" LINUX下没找着这个头文件<br />#include "stdlib.h"<br />#include "string.h"<br /><br />char *mme(char *s1 ,char *s2,char *s3)<br />{<br /> while(*s1!='\0')<br /> {<br /> *s3=*s1; //把值附给S3<br /> s1++;<br /> s3++;<br /> }<br /> while(*s2!='\0')<br /> {<br /> *s3=*s2;<br /> s2++;<br /> s3++;<br /> }<br /> return (s3);<br />}<br /><br />main()<br />{<br /> char *a="12345";<br /> char *c=(char *)malloc(strlen(a));<br /> char *b="abc";<br /><br /> mme(a,b,c);<br /> printf("%s\n",c);<br /> free(c);<br />}<br /><br />把你最初的稍微的改了下,添加了一个字符指针变量C,把A,B的值都塞入C中<br /> while(*s1!='\0')<br /> *p++=*s1++; //跳出循环后,S1已经指到'\0',在往后面添加,就会 造成溢出,从而出现段错误<br /> while(*s2!='\0')<br /> *p++=*s2++;<br />LINUX下,编译,运行都没问题,你可以试试
页:
[1]
2