直接上代码:
/*
* =====================================================================================
*
* 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 们写一个,会是神马样纸?
初级版本:
-
int strtoi ( const char *s )
-
{
-
int num = 0 ;
-
-
while ( *s ) {
-
num = num * 10 +*s - '0' ;
-
++s ;
-
}
-
return num ;
-
}
上面的小程序,okay,基本满足了需求,给一个 "1234",函数 strtoi 返回 1234。but,作为一个库或是模块使用的话,其中有若干个 bug。
问题所在:
- 输入的字符串可能是 NULL;
- 输入的字符串中可能含有其他字符,比如 'a';
- 输入的字符串中可能存在正负号;
- 输入的字符串中的整数可能超出了 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+数,这个简单,不会溢出