atoi()関数の機能:文字列を整数に変換します。atoi()はパラメータ文字列をスキャンし、先行するスペース文字をスキップして、数値または正と負の符号に遭遇するまで変換を開始します。非数値または文字列('\ 0')の場合、変換は終了し、結果が返されます(変換された整数を返します)。
パラメータを渡すときは、次の問題を解決する必要があります。
nullポインタ
空の文字列空白文字の前に+-オーバーフローが続く
非数字
#include <stdio.h> #include <assert.h> #include <ctype.h> #include <limits.h> enum Status { VALID,//合法 INVALID//非法 }status = INVALID; int my_atoi(char* str) { //空指针 assert(str); //空字符串 if (*str == '\0') { return 0; } //空白字符 while (isspace(*str))//查看是否为空白字符 { str++; } //正负号 int flag = 1;//正号 if (*str == '+') { flag = 1; } else if (*str == '-') { flag = -1; str++; } long long n = 0; while (*str!='\0') { if(isdigit(*str))//查看是否为数字字符 { n = n * 10 + flag * (*str - '0'); if (n > INT_MAX || n < INT_MIN) { if (flag == 1) { return INT_MAX; } else if (flag == -1) { return INT_MIN; } break; } } else { break; } str++; } if (*str == '\0') { status = VALID; } return (int)n; } int main() { char arr[] = "111111111111111111111111"; int ret = my_atoi(arr); if (status == VALID) { printf("正常转换:%d\n", ret); } else { printf("非法转换:%d\n", ret); } return 0; }
ここでオーバーフローすると、正はINT_MAXを返し、負はINT_MIN を返します。