简介:
atoi: 是ASCII to integer 的缩写,是把字符串转换成整型数的一种函数
atol: 是ASCII to long 的缩写,是把字符串转换成长长整型数的一种函数
atoll: 是ASCII to long long 的缩写,是把字符串转换成长长整型数的一种函数
atoq: 是一种废弃的atoll版本, 功能与atoll相似, 因为已经废弃, 本次不参与代码实现
代码实现:
aoti
#include <stdio.h> /* * 自己动用实现atoi * 功能: 将数字字符串转换成×××并返回 * author sea time 2016/06/15 */ int myatoi(const char* pstr){ //判断指针是否为空 if(NULL == pstr){ return -1; } //接收指针值, 不改变形参值 const char* p = pstr; //保存结束, 并返回 int retval = 0; //符号, 正数为1, 负数为0 int sign = 1; //跳过前面的空格 while(' ' == *p){ p++; } //判断正负号 if('-' == *p){ sign = -1; } //如果是符号, 指针后移 if('-' == *p || '+' == *p){ p++; } // while('0' <= *p && '9' >= *p){ //字符0在ascii码中对应的是48, 所以需要减字符0 //上一次的值乘10, 并加上本次的值 retval = retval * 10 + ((int)(*p)- '0'); //指针后移 p++; } //返回结果 return retval * sign; } int main(int argc, char* argv[]){ //测试结果 char* p = "-123151"; //打印输出 printf("%s = %d\n", p, myatoi(p)); return 0; }
由于aoti只能实现结果,int32 范围是: 2147483647 ~ -2147483648, 超出范围会进行溢出运算
atol:
#include <stdio.h> /* * 自己动用实现atol * 功能: 将数字字符串转换成长×××并返回 * author sea time 2016/06/15 */ long myatol(const char* pstr){ //判断指针是否为空 if(NULL == pstr){ return -1; } //接收指针值, 不改变形参值 const char* p = pstr; //保存结束, 并返回 long retval = 0; //符号, 正数为1, 负数为0 int sign = 1; //跳过前面的空格 while(' ' == *p){ p++; } //判断正负号 if('-' == *p){ sign = -1; } //如果是符号, 指针后移 if('-' == *p || '+' == *p){ p++; } // while('0' <= *p && '9' >= *p){ //字符0在ascii码中对应的是48, 所以需要减于字符0 //上一次的值乘10, 并加上本次的值 retval = retval * 10 + ((int)(*p)- 48); //指针后移 p++; } //返回结果 return retval * sign; } int main(int argc, char* argv[]){ //测试结果 char* p = "-142222234152654151"; //打印输出结果 printf("%s = %ld\n", p, myatol(p)); return 0; }
atol的范围-9223372036854775808到9223372036854775807 超出范围会进行溢出运算
atoll:
#include <stdio.h> /* * 自己动用实现atoll * 功能: 将数字字符串转换成长长×××并返回 * author sea time 2016/06/15 */ long long myatoll(const char* pstr){ //判断指针是否为空 if(NULL == pstr){ return -1; } //接收指针值, 不改变形参值 const char* p = pstr; //保存结束, 并返回 long long retval = 0; //符号, 正数为1, 负数为0 int sign = 1; //跳过前面的空格 while(' ' == *p){ p++; } //判断正负号 if('-' == *p){ sign = -1; } //如果是符号, 指针后移 if('-' == *p || '+' == *p){ p++; } // while('0' <= *p && '9' >= *p){ //字符0在ascii码中对应的是48, 所以需要减于字符0 //上一次的值乘10, 并加上本次的值 retval = retval * 10 + ((int)(*p)- 48); //指针后移 p++; } //返回结果 return retval * sign; } int main(int argc, char* argv[]){ //测试结果 char* p = "-922337203685477580888"; printf("%s = %lld\n", p, myatoll(p)); return 0; }