| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 506 人关注过本帖
标题:数制转换程序的一个小问题?
只看楼主 加入收藏
autumn2779
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2010-6-5
结帖率:0
收藏
已结贴  问题点数:5 回复次数:5 
数制转换程序的一个小问题?
#include<stdio.h>
char *trec(int idec,int ibase)
{
    char str[20],t;
    int idr,i,p=0;
    while(idec!=0)
    {
        idr=idec%ibase;
        if(idr>=10)
            str[p++]=idr-10+65;
        else
            str[p++]=idr+48;
        idec/=ibase;
    }
    for(i=0;i<p/2;i++)
    {
        t=str[i];
        str[i]=str[p-i-1];
        str[p-i-1]=t;
    }
    str[p]='\0';
    return str;
}

void main()
{
    int x,d;
    scanf("%d,%d",&x,&d);
    printf("%s\n",trec(x,d));
}

此程序我在vc6.0中运行时结果不对,我单步调试了下,发现是str[20]数组有问题,如果改成str[500],比如输入10,2程序就能运行正确。请问有哪个大侠能跟我解释下这是啥原因?
搜索更多相关主题的帖子: return 
2011-05-15 15:57
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:2 
哦, 看错啦

[ 本帖最后由 ansic 于 2011-5-15 16:08 编辑 ]

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-05-15 16:06
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
22    return str;
dc.c: In function `trec':
dc.c:22: warning: function returns address of local variable

GCC编译出错啦。在第22行。

我觉得,既然要返回一个字符数组, 那么就应该在main()里事先定义一个。否则, 在函数里定义的所有变量包括数组,在函数退出之后都将被销毁。

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-05-15 16:26
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:2 
#include<stdio.h>
char *trec(int idec,int ibase)
{
    char str[20],t;
    int idr,i,p=0;
    while(idec!=0)
    {
        idr=idec%ibase;
        if(idr>=10)
            str[p++]=idr-10+65;
        else
            str[p++]=idr+48;
        idec/=ibase;
    }
    for(i=0;i<p/2;i++)
    {
        t=str[i];
        str[i]=str[p-i-1];
        str[p-i-1]=t;
    }
    str[p]='\0';
    return str;
}

void main()
{
    int x,d;
    scanf("%d,%d",&x,&d);
    printf("%s\n",trec(x,d));
}

在栈中定义的变量当该函数调用结束的时候会被系统自动释放了,所以返回的str其实是一个无效的地址,因此会出现问题!

你可以把str[20]这个字符数组定义为全局变量或者是定义为静态变量
你可以这样修改一下你的程序:

程序代码:
#include<stdio.h>

//char str[20];或者在这里定义

char *trec(int idec,int ibase)
{
    static char str[20];//定义为一个静态的变量
    char t;
    int idr,i,p=0;
    while(idec!=0)
    {
        idr=idec%ibase;
        if(idr>=10)
            str[p++]=idr-10+65;
        else
            str[p++]=idr+48;
        idec/=ibase;
    }
    for(i=0;i<p/2;i++)
    {
        t=str[i];
        str[i]=str[p-i-1];
        str[p-i-1]=t;
    }
    str[p]='\0';
    return str;
}

void main()
{
    int x,d;
    scanf("%d,%d",&x,&d);
    printf("%s\n",trec(x,d));
}




愿用余生致力编程
2011-05-15 16:56
shalyf
Rank: 2
等 级:论坛游民
帖 子:21
专家分:18
注 册:2011-5-12
收藏
得分:2 
程序代码:
void main()

 {
     char st[20];
     int x,d;
     scanf("%d,%d",&x,&d);
     strcpy(st,trec(x,d));
     printf("%s\n",st);

 }

奇怪,这样就可以,问题难道出在printf语句上
刚刚查了一下,发现函数 返回局部变量或临时变量的地址
返回字符串的时候返回的是指针,用%s输出的话就会乱码了,用%d输出就可以看到输出的是一个地址,而不是字符串,所以不能直接输出的
要用strcpy函数把字符串复制到一个字符数组中才行

[ 本帖最后由 shalyf 于 2011-5-15 17:34 编辑 ]
2011-05-15 17:21
autumn2779
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2010-6-5
收藏
得分:0 
谢谢啦
2011-05-24 22:13
快速回复:数制转换程序的一个小问题?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049120 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved