minix中atoi、atol、atof的实现

在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<stdio.h>
 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 }

 

转载于:https://www.cnblogs.com/cpoint/p/3367486.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 729. 我的日程安排表 I(set 二分查找)

文章目录1. 题目2. 解题2.1 set 二分查找2.2 差分思想1. 题目 实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排&#xff0c;则可以存储这个新的日程安排。 MyCalendar 有一个 book(int start, int end)方法。 它意味着在 start 到 end 时间内增加…

java基础之lambda表达式

java基础之lambda表达式 1 什么是lambda表达式 lambda表达式是一个匿名函数&#xff0c;允许将一个函数作为另外一个函数的参数&#xff0c;将函数作为参数传递&#xff08;可理解为一段传递的代码&#xff09;。 2 为什么要用lambda表达式 lambda表达式可以写出更简洁更灵…

6.数据查询(条件

查询所有字段select * from 表名; 例&#xff1a;select * from students; 查询指定字段 在select后面的列名部分&#xff0c;可以使用as为列起别名&#xff0c;这个别名出现在结果集中 select 列1,列2,... from 表名; -- 表名.字段名 select students.id,students.name,su…

开源代码分析技巧之——打印调用逻辑

开源代码分析技巧之——打印调用逻辑 在研究开源代码时&#xff0c;大家或许都有这样的感慨&#xff1a; &#xff08;1&#xff09;代码太庞大&#xff0c;少则几万行代码&#xff0c;多则几百万行代码&#xff0c;不知道如何入手&#xff1b; &#xff08;2&#xff09;相关的…

LeetCode 731. 我的日程安排表 II(set二分查找 / 差分思想)

文章目录1. 题目2. 解题2.1 set 二分查找2.2 差分思想1. 题目 实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内不会导致三重预订时&#xff0c;则可以存储这个新的日程安排。 MyCalendar 有一个 book(int start, int end)方法。 它意味着在 start 到 end 时间…

7.排序、聚合函数、分组查询

排序 语法&#xff1a; select * from 表名 order by 列1 asc|desc,列2 asc|desc,... asc从小到大排列&#xff0c;即升序&#xff0c;也可不写&#xff1b; desc从大到小排序&#xff0c;即降序 例1&#xff1a;查询未删除男生信息&#xff0c;按学号降序 select * from…

JSON数据格式以及与后台交互数据转换实例

/*作者&#xff1a;烟大阳仔时间&#xff1a;20131013介绍:主要了解一下json的格式&#xff0c;看看数据是怎么存储的 */ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> &…

05.序列模型 W1.循环序列模型

文章目录1. 为什么选择序列模型2. 数学符号3. 循环Recurrent 神经网络模型4. 通过时间的反向传播5. 不同类型的循环神经网络6. 语言模型和序列生成7. 对新序列采样8. 循环神经网络的梯度消失9. Gated Recurrent Unit&#xff08;GRU单元&#xff09;10. LSTM&#xff08;long s…

8.分页、连接、自关联查询

获取部分行 语法 select * from 表名 limit start,count 从start开始&#xff0c;获取count条数据 start索引从0开始 例1&#xff1a;查询前3行男生信息 select * from students where gender1 limit 0,3; 分页 已知&#xff1a;每页显示m条数据&#xff0c;当前显示第n…

C语言宏定义取得两数的最大值和最小值

/*本程序时为了验证用宏来做 * 两个数的大小比较的写法*/#include<stdio.h>#define MAX(x,y) ((x)<(y)?(y):(x))#define MIN(X,Y) ({\ typeof (X) x_ (X);\ typeof (Y) y_ (Y);\ (x_ < y_) ? x_ : y_; })/*({...})的作用是将内部的几条语句中最后一条的值返回&…

9.数据库中的子查询

子查询 在一个 select 语句中,嵌入了另外一个 select 语句,那么被嵌入的 select 语句称之为子查询语句 主查询 主要查询的对象,第一条 select 语句 主查询和子查询的关系 子查询是嵌入到主查询中 子查询是辅助主查询的,要么充当条件,要么充当数据源 子查询是可以独立存在的语句…

LeetCode 802. 找到最终的安全状态(逆向图+拓扑排序)

文章目录1. 题目2. 解题1. 题目 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走。 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止。 现在, 如果我们最后能走到终点&#xff0c;那么我们的起始节点是最终安全的。 更具体地说, 存在一个自然数 K…

oracle 重建 sys密码文件

需要重建密码文件,具体步骤如下: 1.首先,确定你的密码文件的路径和名称: 在windows下 密码文件路径oracle_home\database 密码文件名称pwdsid.ora 在unix下 密码文件路径oracle_home/dbs 密码文件名称pwdsid Sid为实例名称,查看实例名称 Select instance_name from v$in…

10.数据库中的内置函数

字符串函数 查看字符的ascii码值ascii(str)&#xff0c;str是空串时返回0 查看ascii码值对应的字符char(数字)&#xff1a;select char(97); 拼接字符串concat(str1,str2...)&#xff1a;selectconcat(12,34,ab); 包含字符个数length(str)&#xff1a;selectlength(abc); 截…

Java基础10(反射)

Java基础10&#xff08;反射&#xff09; 1 什么是反射 官方解释&#xff1a;反射&#xff08;reflection&#xff09;技术通常被用来检测和改变应用程序在 Java 虚拟机中的行为表现。它是一个相对而言比较高级的技术&#xff0c;反射是一种强有力的技术特性&#xff0c;因此…

05.序列模型 W1.循环序列模型(作业:手写RNN+恐龙名字生成)

文章目录作业1&#xff1a;建立你的循环神经网络1. RNN 前向传播1.1 RNN 单元1.2 RNN 前向传播2. LSTM 网络2.1 LSTM 单元2.2 LSTM 前向传播3. RNN 反向传播3.1 基础 RNN 反向传播3.2 LSTM 反向传播3.3 LSTM RNN网络反向传播作业2&#xff1a;字符级语言模型&#xff1a;恐龙岛…

给年轻工程师的十大忠告

给年轻工程师的十大忠告 转自http://blog.163.com/tgyeboy02126/blog/static/167507500201191102114940/诸位&#xff0c;咱当电子工程师也是十余年了&#xff0c;不算有出息&#xff0c;环顾四周&#xff0c;也没有看见几个有出息的&#xff01;回顾工程师生涯&#xff0c;感…

11.MYSQL高级(一)

1.账户管理 在生产环境下操作数据库时&#xff0c;绝对不可以使用root账户连接&#xff0c;而是创建特定的账户&#xff0c;授予这个账户特定的操作权限&#xff0c;然后连接进行操作&#xff0c;主要的操作就是数据的crud MySQL账户体系&#xff1a;根据账户所具有的权限的不…

SQL2008中Merge的用法

SQL2008中Merge的用法 在SQL2008中&#xff0c;新增了一个关键字&#xff1a;Merge&#xff0c;这个和Oracle的Merge的用法差不多&#xff0c;只是新增了一个delete方法而已。下面就是具体的使用说明&#xff1a; 首先是对merge的使用说明&#xff1a; merge [into][目标表]usi…

LeetCode 1146. 快照数组(哈希map + 有序map)

文章目录1. 题目2. 解题1. 题目 实现支持下列接口的「快照数组」- SnapshotArray&#xff1a; SnapshotArray(int length) - 初始化一个与指定长度相等的 类数组 的数据结构。初始时&#xff0c;每个元素都等于 0。void set(index, val) - 会将指定索引 index 处的元素设置为…