博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
minix中atoi、atol、atof的实现
阅读量:6603 次
发布时间:2019-06-24

本文共 2897 字,大约阅读时间需要 9 分钟。

在minix2.0源代码中,有将字符串类型转换为int、long、double类型的函数实现,相关的实现函数分别在atoi.c、atol.c、atof.c文件中,我们来逐一学习其中的源码:

1、int atoi(register const char *nptr) :将字符串类型转换为int类型

int atoi(register const char *nptr){    int total = 0;    int minus = 0;    //记录正负的变量(0:'+',1:'-')    while (isspace(*nptr)) nptr++;  //滤去前导空格字符    if (*nptr == '+') nptr++;    else if (*nptr == '-') {        minus = 1;        nptr++;    }    while (isdigit(*nptr)) {        total *= 10;        total += (*nptr++ - '0');    }    return minus ? -total : total;}

2、long atol(register const char *nptr) :将字符串类型转换为long类型,与atoi极为类似

1 long atol(register const char *nptr) 2 { 3     long total = 0; 4     int minus = 0; 5  6     while (isspace(*nptr)) nptr++; 7     if (*nptr == '+') nptr++; 8     else if (*nptr == '-') { 9         minus = 1;10         nptr++;11     }12     while (isdigit(*nptr)) {13         total *= 10;14         total += (*nptr++ - '0');15     }16     return minus ? -total : total;17 }

3、double atof(const char *nptr):将字符串类型转换为double类型

1 double atof(const char *nptr) 2 { 3     double d; 4     int e = errno; 5  6     d = strtod(nptr, (char **) NULL);  7  8      //strtod:  stdlib.h中定义的库函数,将字符串转换为double型 9     //double strtod(const char * restrict nptr, char ** restrict endptr); 10     errno = e;11     return d;12 }

PS:在《C程序设计语言》中Ritchie提供了一种atof的实现:

1 double atof(char *s) 2 { 3     double val, power; 4     int sign, i; 5  6     for (i = 0; isspace(s[i]); i++) 7         ; 8     sign = (s[i] == '-') ? -1 : 1; 9     if (s[i] == '+' || s[i] == '-')10         i++;11     for (val = 0.0; isdigit(s[i]); i++)12         val = 10.0 * val + (s[i] - '0');13     if (s[i] == '.')14         i++;15     for (power = 1.0; isdigit(s[i]); i++) {16         val = 10.0 * val + (s[i] - '0');17         power *= 10.0;18     }19     return sign * val / power;20 }

后面的练习4-2,要求我们对atof函数进行扩展,使它能够处理形如123.45e-6这样的科学表示法

1 #include
2 3 double atof(char *s) 4 { 5 double val, power, temp, exp; 6 char flag; 7 int sign, i; 8 9 for (i = 0; isspace(s[i]); i++)10 ;11 sign = (s[i] == '-') ? -1 : 1;12 if (s[i] == '+' || s[i] == '-')13 i++;14 for (val = 0.0; isdigit(s[i]); i++)15 val = 10.0 * val + (s[i] - '0');16 if (s[i] == '.')17 i++;18 for (power = 1.0; isdigit(s[i]); i++) {19 val = 10.0 * val + (s[i] - '0');20 power *= 10.0;21 }22 temp = sign * val / power;23 if (s[i] == 'e' || s[i] == 'E')24 i++;25 flag = s[i];26 if (flag == '-' || flag == '+')27 i++;28 for (exp = 0; isdigit(s[i]) && s[i] !='\0'; i++) {29 exp = 10.0 * exp + (s[i] - '0');30 }31 if (flag == '+') {32 while(exp--) temp *= 10;33 } else {34 while(exp--) temp /= 10;35 }36 return temp;37 }38 39 int main()40 {41 char a[] = " -2309.12E-15";42 printf("%e\n",atof(a));43 return 0;44 45 }

 

转载地址:http://oegio.baihongyu.com/

你可能感兴趣的文章
HTML5之SessionStorage本地存储
查看>>
error: cannot find javah找不到javah解决办法
查看>>
我的友情链接
查看>>
三种问题可能导致无线路由间歇断开网络
查看>>
MySQL的安装和使用
查看>>
lduan SCDPM 保护组与系统状态(五)
查看>>
我的友情链接
查看>>
docker command and docker file variables
查看>>
说说红黑树
查看>>
HTML --元素
查看>>
spring4 --jar包简介
查看>>
保存图片到图库
查看>>
从相册读取本地保存的二维码并跳转h5链接
查看>>
深入浅出MongoDB应用实战开发视频教程
查看>>
淘宝开店很多人挣钱了为什么你却没挣钱?
查看>>
mysql配置文件my.cnf详解
查看>>
deepin15.4 thinkphp5 nginx 验证码不显示的问题
查看>>
rman备份发生的一点事情(sysaux表空间丢失)
查看>>
BGP邻居状态机
查看>>
Linux学习笔记:sed
查看>>