atoi和itoa的编程实现
前言前几天博主在新浪微薄上看到耗子叔叔考察了atoi的编写,周四博主也要面试阿里(ps:虽然博主LNMP方向,但是还是有信心拼一把),这里也自己实现一下这两个函数,防止面试问到答不出来
atoi
#include <stdio.h> #include <stdlib.h> #define INT_MAX 2147483647 #define INT_MIN -2147483648 int myatoi(const char *s) { int val, flag; unsigned int cutlim, cutoff; // 判断是否为空 if (s == NULL) return 0; // 去除空格和制表符 while (*s == ' ' || *s == '\t') s ++; // 判断符号 if (*s == '-') { flag = 1; s ++; } else { flag = 0; if (*s == '+') s ++; } // 注意越界 cutoff = flag ? (unsigned int) INT_MAX + 1 : INT_MAX; cutlim = cutoff % 10; cutoff /= 10; for (val = 0; *s >= '0' && *s <= '9'; s ++) { if (val > cutoff || (val == cutoff && *s - '0' > cutlim)) { return flag ? INT_MIN : INT_MAX; } val = 10 * val + *s - '0'; } if (flag) return val * -1; else return val; } int main(void) { char str[100]; int num; while (scanf("%s", str) != EOF) { num = myatoi(str); printf("%d\n", num); } return 0; }
itoa
#include <stdio.h> #include <stdlib.h> #define N 15 /** * 异或交换两个数 */ void swap(char *a, char *b) { if (*a != *b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; } } /** * 编程实现windows平台整型转字符串代码 */ void itoa(int value, char *str) { int i, j, k; // 处理负数 if (value < 0) { str[0] = '-'; value *= -1; } else { str[0] = '+'; } for (i = 1; value; i ++, value /= 10) { str[i] = value % 10 + '0'; } // 字符串逆序 for (j = 1, k = i - 1; j <= k; j ++, k --) { swap(str + j, str + k); } // 补字符串结束标识 str[i] = '\0'; // 正数前移一位 if (str[0] != '-') { for (j = 1; j <= i; j ++) { str[j - 1] = str[j]; } } } int main(void) { int value; char str[N]; while (scanf("%d", &value) != EOF) { itoa(value, str); printf("%s\n", str); } return 0; }
补充:软件开发 , C++ ,