免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1836 | 回复: 0
打印 上一主题 下一主题

[讨论]关于atoi()的讨论 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-21 14:54 |只看该作者 |倒序浏览
5可用积分
书上有道练习题要求将C标准库函数中的atoi()的功能用C语言实现并在某个主叫函数中加以验证。我自己写了一个myatoi(),可以实现atoi()的功能但还是有些问题,请各位加以指正。谢谢!

/*Use the character classification functions to prepare an
implementation of atoi().*/

#include <stdio.h.>
#include <math.h>

#define N 10

int myatoi(const char *);  
int isdigit(const char);  //判断某个字符是否是数字的函数
int mypow(int,int);       //我自己写的幂函数,以正整数为底和指数

int main(void){
   
    char getstr[N];
   
    while(gets(getstr))
        printf("\nValue: %d\n",myatoi(getstr));
    getch();
    return 0;
}

int myatoi(const char *ar){
   
    int val = 0,i = 0,cnt = 0;
    int flag,j;
    int itar[N];
    char recneg;
   
    while(*ar){   
        if(*ar == '-'){
           if(isdigit(*(ar+1)) && !isdigit(*(ar-1)))
            //当负号前面不是数字而后面是数字时
               recneg = '-';
           else if(isdigit(*(ar+1)) && isdigit(*(ar-1))){
            //当负号前后都是数字时
               flag = 1;
               break;
           }
       }      
       if(isspace(*ar) && isdigit(*(ar+1))
       && isdigit(*(ar-1))){
           flag = 1;
           break;
       }     
        if(!isdigit(*ar) && *ar != '-' && !isspace(*ar)){
        //当字符为数字、空格、负号以外的字符时
            if(isdigit(*(ar-1))){
        //当该字符前面是数字时
                flag = 1;
                break;
            }   
            else{
                flag = 0;
                break;
            }
        }
        if(isdigit(*ar)){
            itar = *ar - 48; //将字符数字转化为相应的整型数字并存入数组
            cnt++;
            i++;
        }   
        ar++;
    }
    for(i = 0,j = cnt-1; i < cnt, j >= 0; i++,j--){
    //这个循环将数组元素逐个乘以相应次数的权然后将所得的积相加得到需要的整数
        val += itar * mypow(10,j);
       }
    if(flag == 0)
        return flag;
    else{
        if(recneg == '-')
            return -val;
        else
            return val;
    }
}   

int isdigit(char ch){
   
    if(ch > '9' || ch < '0')
        return 0;
    else
        return 1;
}        

int mypow(int x, int y){
   
    int i;
    int z = 1;
   
    for(i = 0; i < y; i++)
        z *= x;
    return z;
}

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP