atoi(),atof等函数的实现
atoi()函数的功能:将字符串转换成整型数;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回(返回转换后的整型数)。
atoi()函数实现的代码:
- /*
- * name:xif
- * coder:xifan@2010@yahoo.cn
- * time:08.20.2012
- * file_name:my_atoi.c
- * function:int my_atoi(char* pstr)
- */
- int my_atoi(char* pstr)
- {
- int Ret_Integer = 0;
- int Integer_sign = 1;
- /*
- * 判断指针是否为空
- */
- if(pstr == NULL)
- {
- printf("Pointer is NULL\n");
- return 0;
- }
- /*
- * 跳过前面的空格字符
- */
- while(isspace(*pstr) == 0)
- {
- pstr++;
- }
- /*
- * 判断正负号
- * 如果是正号,指针指向下一个字符
- * 如果是符号,把符号标记为Integer_sign置-1,然后再把指针指向下一个字符
- */
- if(*pstr == '-')
- {
- Integer_sign = -1;
- }
- if(*pstr == '-' || *pstr == '+')
- {
- pstr++;
- }
- /*
- * 把数字字符串逐个转换成整数,并把最后转换好的整数赋给Ret_Integer
- */
- while(*pstr >= '0' && *pstr <= '9')
- {
- Ret_Integer = Ret_Integer * 10 + *pstr - '0';
- pstr++;
- }
- Ret_Integer = Integer_sign * Ret_Integer;
- return Ret_Integer;
- }
现在贴出运行my_atoi()的结果,定义的主函数为:int main ()
- int main()
- {
- char a[] = "-100";
- char b[] = "456";
- int c = 0;
- int my_atoi(char*);
- c = atoi(a) + atoi(b);
- printf("atoi(a)=%d\n",atoi(a));
- printf("atoi(b)=%d\n",atoi(b));
- printf("c = %d\n",c);
- return 0;
- }
头文件:#include <stdlib.h>函数 atof() 用于将字符串转换为双精度浮点数(double),其原型为:
double atof (const char* str);
atof() 的名字来源于 ascii to floating point numbers 的缩写,它会扫描参数str字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。参数str
字符串可包含正负号、小数点或E(e)来表示指数部分,如123. 456 或123e-2。
【返回值】返回转换后的浮点数;如果字符串 str 不能被转换为 double,那么返回 0.0。
温馨提示:ANSI C 规范定义了 stof()、atoi()、atol()、strtod()、strtol()、strtoul() 共6个可以将字符串转换为数字的函数,大家可以对比学习;使用
atof() 与使用 strtod(str, NULL) 结果相同。另外在 C99 / C++11 规范中又新增了5个函数,分别是 atoll()、strtof()、strtold()、strtoll()、strtoull()。
#include<iostream> using namespace std; double atof_my(const char *str) { double s=0.0; double d=10.0; int jishu=0; bool falg=false; while(*str==' ') { str++; } if(*str=='-')//记录数字正负 { falg=true; str++; } if(!(*str>='0'&&*str<='9'))//如果一开始非数字则退出,返回0.0 return s; while(*str>='0'&&*str<='9'&&*str!='.')//计算小数点前整数部分 { s=s*10.0+*str-'0'; str++; } if(*str=='.')//以后为小树部分 str++; while(*str>='0'&&*str<='9')//计算小数部分 { s=s+(*str-'0')/d; d*=10.0; str++; } if(*str=='e'||*str=='E')//考虑科学计数法 { str++; if(*str=='+') { str++; while(*str>='0'&&*str<='9') { jishu=jishu*10+*str-'0'; str++; } while(jishu>0) { s*=10; jishu--; } } if(*str=='-') { str++; while(*str>='0'&&*str<='9') { jishu=jishu*10+*str-'0'; str++; } while(jishu>0) { s/=10; jishu--; } } } return s*(falg?-1.0:1.0); } int main() { char *s1=" 123.456567567e-10"; char *a1=" 123.456567567e-10"; char *s2="1234567.235e+10"; char *a2="1234567.235e+10"; char *s3=" 123.45656\07567e-10"; char *a3=" 123.45656\07567e-10"; double sum_1=atof_my(s1); double sum1=atof(a1); double sum_2=atof_my(s2); double sum2=atof(a2); double sum_3=atof_my(s3);//遇到'\0'结束 double sum3=atof(a3); cout<<"atof_my:"<<sum_1<<endl; cout<<"atof :"<<sum1<<endl; cout<<"atof_my:"<<sum_2<<endl; cout<<"atof :"<<sum2<<endl; cout<<"atof_my:"<<sum_3<<endl; cout<<"atof :"<<sum3<<endl; system("pause"); return 0; }
C/C++基本语法学习
STL
C++ primer