编程实现C函数 atoi atof

 题目一:编程实现 atoi函数 (要求能够 识别 超出整数范围的 字符所转换的整数)

这个比较简单        采用字符指针遍历实现   注意:字符转换成对应数字要减 ‘0’,  数字转换成 相应字符 加上‘0’

//编程实现atoi 函数
#include<stdio.h>
#include<stdlib.h>

#define INT_MAX 21474883647
#define INT_MIN -2147483648

int myatoi(const char *string)
{
        int val,flag;
        unsigned int cutlim,cutoff;

        if(string==NULL) return 0;
        while(*string == ' '||*string == '\t')
                string ++;

        if(*string =='-'){
                flag = 1;
                string++;
        }
        else{
           flag = 0;
           if(*string == '+')
                string ++;
        } 

        cutoff = flag ?(unsigned int) INT_MAX+1 : INT_MAX;
        cutlim = cutoff % 10;
        cutoff /= 10;                        //用来判断是否会超出整数范围的指标

        for(val = 0;isdigit(*string);string++){
                if(val >cutoff ||(val==cutoff && (*string - '0')>cutlim))  //满足这个条件 表示转换的数会超出整数范围i 返回相应的上界或者下界
                        return flag ? INT_MIN : INT_MAX;
                val = val*10 + (*string - '0');
        }

        if(flag)
                return val*(-1);
        else
                return val;
}

int main()
{
        char str[100];
        int num;
        while(scanf("%s",str)!=EOF){
                num = myatoi(str);
                printf("%d\n",num);
        }
        return 0;
}
  

 题目二:编程实现 atof函数 (要求能够 识别 含有科学计数法的字符串所表示的整数

atof 函数的复杂之处在于 要对字符串中出现的小数点后面的字符 和 科学计数标志e E后面的字符进行 特殊处理

对于小数点后面的数 要计算出其位数 n 然后让最后算的值除10^n   科学计数法后面的数要单独算出其值 m 然后乘 或者 除 10^m 

//对atof函数进行扩充,使其可以处理科学计数法形式的字符如 123.45e-6

#include<stdio.h>
#include<ctype.h>

double myatof(char *string)
{
        double val,power;
        int flag,exp,i;

        if(string == NULL) return 0;
        for(; isspace(*string);string++)
                ;

        flag = (*string == '-') ? -1 : 1;
        if(*string == '-' || *string =='+')
        string++;

        for(val = 0.0;isdigit(*string);string++){
                val = val*10.0 + (*string - '0');
         }

        if(*string == '.')  //对小数点后面部分数的处理
                string++;
        for(power = 1.0;isdigit(*string);string++){
                val = val*10.0 + (*string - '0');
                power *= 10.0;
         }
        val = (flag * val) / power;

        if(*string == 'e'|| *string == 'E'){     //对含有科学计数法的 字符的处理
                flag = (*++string == '-') ? -1 : 1;
                if (*string =='+' ||*string == '-')
                        string++;
                for(exp = 0;isdigit(*string);string++)
                        exp = exp*10 + (*string - '0');
                if(flag == -1){
                        while(exp-- >0)
                                val /= 10.0;
                }
                if(flag == 1){
                        while(exp-- >0)
                                val *= 10.0;
                }
        }
        return val;
}

int main()
{
        char str[100];
        double num;
        while(scanf("%s",str)!=EOF){
                num = myatof(str);
                printf("%f\n",num);
        }
        return 0;
           


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值