minix中atoi、atol、atof的实现
生活随笔
收集整理的這篇文章主要介紹了
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
總結
以上是生活随笔為你收集整理的minix中atoi、atol、atof的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CPC客户端从写作到提交成功的巨坑
- 下一篇: 中国专利电子申请网CPC客户端的安装教程