打印

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

[复制链接]
3502|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不动不就得了。

使用特权

评论回复
5
static|  楼主 | 2008-8-18 14:02 | 只看该作者

继续

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

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

依然未果,继续请教!谢谢

使用特权

评论回复
6
xwj| | 2008-8-18 14:32 | 只看该作者

唉... 建议LZ改行.

使用特权

评论回复
7
static|  楼主 | 2008-8-18 15:00 | 只看该作者

dd

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

继续顶!

使用特权

评论回复
8
xinzha| | 2008-8-18 15:41 | 只看该作者

ll

别return s3,return s1啊。

使用特权

评论回复
9
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],然后再运算即可.

使用特权

评论回复
10
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();
}

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

谢谢各位....

使用特权

评论回复
11
static|  楼主 | 2008-8-18 16:13 | 只看该作者

谢谢

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

小问题,大家可以自试试看!

使用特权

评论回复
12
static|  楼主 | 2008-8-18 16:23 | 只看该作者

谢谢

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

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

1:定义大数组
2:使用动态内存分配
3:????

使用特权

评论回复
13
hanslong| | 2008-8-18 17:32 | 只看该作者

re

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

使用特权

评论回复
14
xinzha| | 2008-8-18 17:51 | 只看该作者

ll

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

使用特权

评论回复
15
1dqmoon| | 2008-8-18 21:53 | 只看该作者

11楼的程序都无法编译

怎么多了个pp?

malloc后最好判断一下是否申请到了内存, 否则执行下去还是错的

使用特权

评论回复
16
zjj2k| | 2008-8-19 09:42 | 只看该作者

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

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

使用特权

评论回复
17
static|  楼主 | 2008-8-19 21:43 | 只看该作者

DD

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

使用特权

评论回复
18
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后,运行,也是提示段错误

使用特权

评论回复
19
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();
}

使用特权

评论回复
20
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下,编译,运行都没问题,你可以试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

131

帖子

1

粉丝