| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 739 人关注过本帖
标题:一道思考不出来的C语言题目,请教Tong..
只看楼主 加入收藏
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:8 
一道思考不出来的C语言题目,请教Tong..
我想表达意思是我字符串是可以以指针把里面内容取出来.  但是取出来之后也只能存到数组里.   怎么去转成INT ?

题目:
 请实现一个函数,将一个String 转成int  函数原型如下:
 int atoi(char *s);
搜索更多相关主题的帖子: C语言 字符串 
2012-07-05 11:17
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:2 
同样的问题请不要重复的发贴。一会儿我将删去其余的两个贴子。如果你想引起Tony的注意可以自己顶贴,或者我帮你置顶一段时间(如果你想的话)。

重剑无锋,大巧不工
2012-07-05 11:40
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:2 
如果想向Tony请教,请把名字拼对

总有那身价贱的人给作业贴回复完整的代码
2012-07-05 12:02
S_Ringo
Rank: 4
来 自:歌舞伎町
等 级:业余侠客
帖 子:94
专家分:230
注 册:2012-4-15
收藏
得分:2 
我不是T版,但是也试了一下:
#include<stdio.h>
#include<string.h>
int atoi(char *s)
{
    int length=strlen(s);
    char *p=s+length-1;
    int sum=(*p)-48;
    int s_bit=1;
    length--;
    p--;
    while(length>0)
    {
        s_bit=s_bit*10;
        sum=sum+((*p)-48)*s_bit;
        length--;
        p--;
    }
    return(sum);
}
int main()
{
    char c_array[20];
    char *s=c_array;
    int i;
    for(i=0;i<19;i++)
    {
        c_array[i]='0';
    }
    scanf("%s",s);
    i=atoi(s);
    printf("%d\n",i);
    return(0);
}
这样好像也可以哦……不过没有加入输入错误检测的部分……
2012-07-05 12:30
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:2 
程序代码:
#include <stdio.h>

int atoi(char *s)
{
    int length=0,sum = 0;
    char *p = s;
    while(*p++) {length++;} //求出s的长度
    p = s;
    while(length>1)
    {
        sum+= *p-'0'; //从首位起逐个加到sum中
        sum*=10;
        length--;
        p++;
    }
    sum+= *p-'0'; //加上个位数的时候就不需要再sum*=10了。
    return sum;
}

int main(int argc, char *argv[])
{
    char buff[20];
    printf("input a string: ");
    scanf("%s",buff);
    printf("atoi(buff) is: %d",atoi(buff));
    return 0;
}

同样没有加入容错机制

找了一串据说是atoi源码的DD
程序代码:
isspace(int x)
{
if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r')
return 1;
else
return 0;
}
isdigit(int x)
{
if(x<='9'&&x>='0')        
return 1;x`
else
return 0;

}
int atoi(const char *nptr)
{
        int c;              /* current char */
        int total;         /* current total */
        int sign;           /* if '-', then negative, otherwise positive */

        /* skip whitespace */
        while ( isspace((int)(unsigned char)*nptr) )
            ++nptr;

        c = (int)(unsigned char)*nptr++;
        sign = c;           /* save sign indication */
        if (c == '-' || c == '+')
            c = (int)(unsigned char)*nptr++;    /* skip sign */

        total = 0;

        while (isdigit(c)) {
            total = 10 * total + (c - '0');     /* accumulate digit */
            c = (int)(unsigned char)*nptr++;    /* get next char */
        }

        if (sign == '-')
            return -total;
        else
            return total;   /* return result, negated if necessary */
}



从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-07-05 12:53
shockwave
Rank: 2
等 级:论坛游民
帖 子:13
专家分:42
注 册:2010-10-31
收藏
得分:2 
{
书看了很多很多一知半解;
码打了很多很多还是不懂;
人问了很多很多没有回复;
0和1的世界没有我的存在;
}
2012-07-05 13:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
以下是引用wangchengbin在2012-7-5 11:17:12的发言:

我想表达意思是我字符串是可以以指针把里面内容取出来.  但是取出来之后也只能存到数组里.   怎么去转成INT ?

题目:
 请实现一个函数,将一个String 转成int  函数原型如下:
 int atoi(char *s);

不好意思,我现在才发现这个帖子。等会又要外出,简单说一下思路吧:根据要求,传入的是字符串指针,返回结果整数,处理的办法是逆向扫描传入的字符串,对每一个字符都检查是不是'0'-'9'的字符,是的话,就用楼上各位的办法把它计算到一个整数中,最后返回。这时你首先要确定一个法则:是否允许传入的字符串中有非法字符,如果允许,就用上面的过滤法,如果不允许,不管算到哪里,一旦发现有非法字符,就立马返回(想办法返回出错消息,因为如果要考虑整个整数集合范围的话,0和-1都是合法的返回值,无法区分是错码还是真实的结果值)。同样,上面所说的不考虑'-'、'+'字符,如果你确定要考虑这些东西,情形又复杂了许多。这个细节性的手法,需要考虑的问题其实很多,整数越界也是一个问题。

另外一个取巧的办法,是利用sscanf()函数,先用上面的过滤法把数字字符提取到一个字符串数组中,然后用sscanf()函数把它读入到一个整数中,就如手动敲入数字读取一样。

总之,这个题目的算法不难,但如何考虑处理法则,才是值得思考的。

btw:其实我以前也告诫过朋友们,最好不要点名问问题的,毕竟别人看到不舒服,有时被点的人未必可以回答满意,而别的懂的人又不愿意参与回答,这样只会耽误自己,因此,最好不要这样做。

[ 本帖最后由 TonyDeng 于 2012-7-5 13:42 编辑 ]

授人以渔,不授人以鱼。
2012-07-05 13:16
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:2 
total = 10 * total + (c - '0');     /* accumulate digit */
这句是关键,不过C库函数在说明这个函数中,指出没有进行整数溢出容错处理。

我们都在路上。。。。。
2012-07-05 13:58
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 8楼 hellovfp
谢谢大家提醒.
2012-07-05 14:31
快速回复:一道思考不出来的C语言题目,请教Tong..
数据加载中...
 
   



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

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