atoi这个库函数实在的太强大了,很多细节上的处理是我们无法想象的,不过最近也尝试做了一下这个练习,发现真的不是那么简单,只实现了一部分功能。如将字符串”123″转换为123,”-0123″转换为-123。代码功能比较简陋,还有诸多没有实现的功能,相比库函数atoi还差的很多,仅供参考。
#include <stdio.h> #include <stdlib.h> int myatoi(char* buf) { // 备份一个文件指针 char* buf_back = buf; // 记录返回值 int myint = 0; // 记录首次出现数字字符的下标位置 int fast_int = 0; // while循环中依次递增的索引 int idx = 0; // 循环判断字符串是否走到了\0 while (*buf) { // 如果*buf的ASCII码在48~57之间 if (*buf >= 48 && *buf <= 57) { // 判断下标是否被记录过 if (fast_int == 0) { // 如果下标为0证明没有被记录过 // 那么记录下标为idx的值 fast_int = idx; } // 将myint的值与新*buf的值合并 sum = sum*10+(n-48) myint = myint * 10 + (*buf - 48); } // 索引递增 idx++; // 指针递增 buf++; } // 如果首次发现的下标大于0 if (fast_int > 0) { // 判断首次记录的下标的上一个下标对应的值是不是 "-" 号的ASCII码 if (buf_back[fast_int - 1] == 45) { // 如果是则把myint值置为负数,就是*-1 myint *= -1; } } // 返回myint的值 return myint; } int main(int argc, char* argv[]) { printf("%d\n", myatoi("25")); printf("%d\n", myatoi("-025")); return 0; }