将字符串转换成double或者int的实现(c programming language)

直接上代码:

/*
 * =====================================================================================
 *
 *       Filename:  atof.cpp
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2012年12月31日 14时39分22秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Weidong Yang (cn), ywdong@mail2.sysu.edu.cn
 *        Company:  
 *
 * =====================================================================================
 */

#include <cstdio>
#include <ctype.h> //use for isdigit(),isspace()
#include <cmath>

/* atof:covert string s to double */
double atof(char s[])
{
    double val;
    int i,v_pow,sign,e_sign,e_pow;

    for (i = 0; isspace(s[i]); i++) // skip the white space
        ;
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '-' || s[i] == '+')
        i++;
    for (val = 0; isdigit(s[i]); i++)
        val = val * 10 + (s[i] - '0');
    if (s[i] == '.')
        i++;
    for (v_pow = 1; isdigit(s[i]); i++)
    {
        val = val * 10 + (s[i] - '0');
        v_pow *= 10;
    }
    if (s[i] == 'e' || s[i] == 'E') // handle scientific notation
        i++;
    e_sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '-' || s[i] == '+')
        i++;
    for (e_pow = 0; isdigit(s[i]); i++)
        e_pow = e_pow * 10 + (s[i] - '0');
    e_pow *= e_sign;
    return sign * (val * pow(10, (double)e_pow)) / v_pow;
}

double atoi(char s[])
{
    return (int)atof(s);
}

int main()
{
    char s[] = "-45.67e-100";
    double d = atof(s);
    printf("%g\n", d);
    char ss[] = "-45e4";
    int i = atoi(ss);
    printf("%d\n", i);
    return 0;
}

-----------------------------------------------------分割线-----------------------------------------------------------------------------------------

下面的内容转载自http://ilovers.sinaapp.com/drupal/node/62

将字符串转化为整数( maybe 浮点数?)是一个灰常基本的需求,基本到只要是涉及到数字的实际应用,都会有用到。然而这么一个转换程序并没有想象的那么简单,不过不用担心,几乎所有的语言库都有提供转化,比如 C 语言中就有个 atoi 函数。现在的问题是,如果让 me 们写一个,会是神马样纸?

初级版本:

  1. int strtoi ( const  char  *s )
  2. {
  3.      int num  =  0 ;
  4.  
  5.      while ( *s ) {
  6.         num  = num * 10 +*s - '0' ;
  7.          ++s ;
  8.      }
  9.      return num ;
  10. }

上面的小程序,okay,基本满足了需求,给一个 "1234",函数 strtoi 返回 1234。but,作为一个库或是模块使用的话,其中有若干个 bug。

问题所在:

  1. 输入的字符串可能是 NULL;
  2. 输入的字符串中可能含有其他字符,比如 'a';
  3. 输入的字符串中可能存在正负号;
  4. 输入的字符串中的整数可能超出了 int 的取值范围;

第一个问题和第二个问题容易解决,加些判断条件过滤一下基本就 ok;第三个,也不难,根据首字符判断正负号;关键是第四个问题。神马时候会溢出?溢出后是个神马情况?两个正数相加会溢出,结果为负数;两个负数相加会溢出,结果为正数或是0!来验证一下结论,墙上的钟表,0点到11点,如果看成是整数的话,是0-11,如果换成有符号数,应该是0到5,-6到-1;me 们做做加法(加1向右数,减1向左数,0 的左端是 -1,-1 的右端是0)。

溢出分析:

// 0  1  2  3  4  5   6   7   8   9  10  11
// 0  1  2  3  4  5  -6  -5  -4  -3  -2  -1

 5 + 5 = 10  = -2    // 正+正=负
-5 +-5 = -10 = 2    // 负+负=正
-6 +-6 = -12 = 0    // 负+负=0

// 正+负 = 负+正,结果不可能溢出,因为结果应该介于相加的正数和负数之间
// 正+正 溢出后的结果不可能是正,最好的溢出情况是1+5=-6,最坏的溢出情况是5+5=-2,溢出的结果应该在 -6和-2之间
// 负+负 溢出后的结果不可能为负,最坏的溢出情况是 -6 + -6 = 0,最好的溢出情况是 -1 + -6 = 5,溢出后的结果应该在0和5之间
// 数+0 = 0+数,这个简单,不会溢出
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值