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

[复制链接]
5008|32
 楼主| static 发表于 2008-8-18 12:51 | 显示全部楼层 |阅读模式
#include "stdio.h"
#include "conio.h"

//函数作用:把字符串S2加在字符串S1的后面并返回新的指针地址
char *mme(char *s1 ,char *s2)
{
    while(*s1!='\0')
        s1++;
    while(*s2!='\0')
    {
        *s1=*s2;
        s1++;
        s2++;
    }
    return (s1);
}

//作用:把b的字符串放在a后面并输出新的字符串内容
main()
{

    char *a="12345";
    char *b="abc";
    char *p=mme(a,b);
    printf("%s\n",p);
    getch();
}


请问各位:以上函数可以编译通过,但是没有结果;请问错误在哪里?或者如何修改?
xwj 发表于 2008-8-18 13:10 | 显示全部楼层

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

当然就是什么都没有
 楼主| static 发表于 2008-8-18 13:19 | 显示全部楼层

如梦初醒!

楼上认为该如何修改?

是不是求出S1字符串的长度L=strlen(s1)之后,再循环L次,返回S1首地址?

谢谢!
xinzha 发表于 2008-8-18 13:40 | 显示全部楼层

ll

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

 楼主| static 发表于 2008-8-18 14:02 | 显示全部楼层

继续

回楼上,在函数内部后面加上一句:

char *s3;
.......
.......
strcpy(s3,s1);
return s3;

依然未果,继续请教!谢谢
xwj 发表于 2008-8-18 14:32 | 显示全部楼层

唉... 建议LZ改行.

 楼主| static 发表于 2008-8-18 15:00 | 显示全部楼层

dd

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

继续顶!
xinzha 发表于 2008-8-18 15:41 | 显示全部楼层

ll

别return s3,return s1啊。
wlq_9 发表于 2008-8-18 15:47 | 显示全部楼层

估计LZ

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

谢谢楼上

谢8楼!8楼所言极是,程序编译结果没有错,就是提示内存错误!
依据8楼所言,一种办法是可以把a定义为一个大数组解决内存溢出的问题,另外是否可用下面的方法?

#include "stdio.h"
#include "conio.h"

//返回新的指针地址,指向s1+s2后的内容
char *mme(char *s1 ,char *s2)
{
    char *p=(char *)malloc(strlen(s1)+strlen(s2));
    char *s_addr=p;      //暂时保存p的起始地址;
    while(*s1!='\0')
        *p++=*s1++;
    while(*s2!='\0')
        *p++=*s2++;
    p=pp;               //返回首地址
    return (p);
}

main()
{

    char *a="12345";
    char *b="abc";
    char *p=mme(a,b);
    printf("%s\n",p);
    free(p);
    getch();
}

此方法程序编译通过输出结果正确之外还有一些乱码,不知道还没有其他好的解决办法?

谢谢各位....
 楼主| static 发表于 2008-8-18 16:13 | 显示全部楼层

谢谢

回9楼,返回s1是不行的,程序编译报错,并指出内存错误,可能是内存溢出;
再者9楼也犯了2楼所说的错误....

小问题,大家可以自试试看!
 楼主| static 发表于 2008-8-18 16:23 | 显示全部楼层

谢谢

根据10楼的方法是不是要在所有定义变量前加上 char data a="12345" ?

还有没有其他更好的解决办法?

1:定义大数组
2:使用动态内存分配
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?

malloc后最好判断一下是否申请到了内存, 否则执行下去还是错的
zjj2k 发表于 2008-8-19 09:42 | 显示全部楼层

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

这是c初学者最易范的常识性错误,楼上有人说出了问题的要点。
 楼主| static 发表于 2008-8-19 21:43 | 显示全部楼层

DD

这个问题最要注意的就是内存溢出问题!
korking 发表于 2008-8-19 22:11 | 显示全部楼层

一起进步

char *mme(char *s1 ,char *s2)
{
    char *p=(char *)malloc(strlen(s1)+strlen(s2));
    char *s_addr=p;      //暂时保存p的起始地址;
    while(*s1!='\0')
        *p++=*s1++;
    while(*s2!='\0')
        *p++=*s2++;
    p=pp;               //返回首地址
    return (p);
}
把你的代码在linux下用GCC调试了一下
p=pp ??哪来的PP?这也能运行出结果?
挂掉PP后,运行,也是提示段错误
icmap 发表于 2008-8-19 22:24 | 显示全部楼层

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

1楼用错指针。

你怎么知道字符串"12345"的后面就一定是空闲空间?居然修改其后面的内容,这很有可能会把其它内容冲掉。

11楼是没理解局部变量的生存期
在函数 mme 结束后,指针 p 所指向的内存已经被释放了,有乱码也就不奇怪了。

楼主还是赶紧吧指针、内存和局部变量的知识理解透彻吧,否则有得你搞的。

建议改为如下内容:

#include "stdio.h"
#include "conio.h"

//返回新的指针地址,指向s1+s2后的内容
void mme(char *s1, char *s2, char *p)
{
    while(*s1!='\0')
        *p++=*s1++;
    while(*s2!='\0')
        *p++=*s2++;
    *p='\0';
}

main()
{
    char *a="12345";
    char *b="abc";
    char *p=(char *)malloc(strlen(a)+strlen(b)+1);

    mme(a,b,p);
    printf("%s\n",p);
    free(p);
    getch();
}
korking 发表于 2008-8-19 22:43 | 显示全部楼层

稍微的改了一点

#include "stdio.h"
//#include "conio.h"  LINUX下没找着这个头文件
#include "stdlib.h"
#include "string.h"

char *mme(char *s1 ,char *s2,char *s3)
{
    while(*s1!='\0')
         {
         *s3=*s1;  //把值附给S3
           s1++;
           s3++;
         }
    while(*s2!='\0')
       {
       *s3=*s2;
        s2++;
        s3++;
       }
  return (s3);
}

main()
{
    char *a="12345";
    char *c=(char *)malloc(strlen(a));
    char *b="abc";

    mme(a,b,c);
    printf("%s\n",c);
    free(c);
}

把你最初的稍微的改了下,添加了一个字符指针变量C,把A,B的值都塞入C中
   while(*s1!='\0')
        *p++=*s1++;  //跳出循环后,S1已经指到'\0',在往后面添加,就会            造成溢出,从而出现段错误
    while(*s2!='\0')
        *p++=*s2++;
LINUX下,编译,运行都没问题,你可以试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

133

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部