在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 = ;
int minus = ; //记录正负的变量(0:'+',1:'-') while (isspace(*nptr)) nptr++; //滤去前导空格字符
if (*nptr == '+') nptr++;
else if (*nptr == '-') {
minus = ;
nptr++;
}
while (isdigit(*nptr)) {
total *= ;
total += (*nptr++ - '');
}
return minus ? -total : total;
}

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

 long atol(register const char *nptr)
{
long total = ;
int minus = ; while (isspace(*nptr)) nptr++;
if (*nptr == '+') nptr++;
else if (*nptr == '-') {
minus = ;
nptr++;
}
while (isdigit(*nptr)) {
total *= ;
total += (*nptr++ - '');
}
return minus ? -total : total;
}

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

 double atof(const char *nptr)
{
double d;
int e = errno; d = strtod(nptr, (char **) NULL); //strtod: stdlib.h中定义的库函数,将字符串转换为double型
//double strtod(const char * restrict nptr, char ** restrict endptr);
errno = e;
return d;
}

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

 double atof(char *s)
{
double val, power;
int sign, i; for (i = ; isspace(s[i]); i++)
;
sign = (s[i] == '-') ? - : ;
if (s[i] == '+' || s[i] == '-')
i++;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '');
if (s[i] == '.')
i++;
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '');
power *= 10.0;
}
return sign * val / power;
}

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

 #include<stdio.h>

 double atof(char *s)
{
double val, power, temp, exp;
char flag;
int sign, i; for (i = ; isspace(s[i]); i++)
;
sign = (s[i] == '-') ? - : ;
if (s[i] == '+' || s[i] == '-')
i++;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '');
if (s[i] == '.')
i++;
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '');
power *= 10.0;
}
temp = sign * val / power;
if (s[i] == 'e' || s[i] == 'E')
i++;
flag = s[i];
if (flag == '-' || flag == '+')
i++;
for (exp = ; isdigit(s[i]) && s[i] !='\0'; i++) {
exp = 10.0 * exp + (s[i] - '');
}
if (flag == '+') {
while(exp--) temp *= ;
} else {
while(exp--) temp /= ;
}
return temp;
} int main()
{
char a[] = " -2309.12E-15";
printf("%e\n",atof(a));
return ; }

最新文章

  1. Java--剑指offer(8)
  2. call() 和 apply() ----预定义的函数方法
  3. ssh框架介绍
  4. SqlServer数据库备份与还原
  5. POJ 2442 Sequence
  6. Python_Day6_反射_正则表达式之篇
  7. Java-Thread
  8. Ajax实现步骤和原理
  9. 编程之美:1.9高效率安排见面会 图的m着色问题 回溯法
  10. prefuse学习(一)用非数据库连接和xml的方式读入数据
  11. 密钥,密钥对,公钥,pfx,jks和https的几个概念
  12. Bluetooth LE(低功耗蓝牙) - 第二部分
  13. HDOJ 2188 悼念512汶川大地震遇难同胞——选拔志愿者
  14. 解决WebService本地访问正常,远程无法访问的问题
  15. 001.为什么选择用AngularJs开发?
  16. 【HDOJ】1438 钥匙计数之一
  17. GCC、GDB、Makefile
  18. 【Oracle】wmsys.wm_concat函数字段值为空
  19. .Net Core 读取appsettings.json的配置
  20. Salesforce的Auto Number

热门文章

  1. 和我一起学《HTTP权威指南》——客户端识别与cookie机制
  2. 解决parseSdkContent failed java.lang.NullPointerException错误
  3. openURL调用其他程序(转)
  4. PMP用语集
  5. ios开发之--字符串局部改变颜色
  6. 查询mssql 密码
  7. date 类型转为varchar
  8. codeforces水题100道 第十四题 Codeforces Round #321 (Div. 2) A. Kefa and First Steps (brute force)
  9. Java实现简单的正则表达式匹配
  10. Java枚举的小用法