劍指offer第四十九題:把字符串轉換爲整數ios
1 //============================================================================ 2 // Name : JZ-C-49.cpp 3 // Author : Laughing_Lz 4 // Version : 5 // Copyright : All Right Reserved 6 // Description : 把字符串轉換爲整數 7 //============================================================================ 8 9 #include <iostream> 10 #include <stdio.h> 11 #include <stdlib.h> 12 using namespace std; 13 14 long long StrToIntCore(const char* str, bool minus); 15 16 enum Status { 17 kValid = 0, kInvalid //此時kInvalid爲1,若是沒有定義enum變量的需求,枚舉變量的值能夠省略。在以上形式下,第一個值默認值爲0,如下各個分別爲上一個值加1。 18 }; 19 int g_nStatus = kValid;//定義全局變量,反映輸入是否合法 20 21 int StrToInt(const char* str) { 22 g_nStatus = kInvalid;//初始爲1:不合法 23 long long num = 0;//用long long型存儲轉換的str,實際返回的則是int型★ 24 25 if (str != NULL && *str != '\0') {//考慮空指針NULL或字符串爲空"",函數直接返回0,且全局變量g_nStatus爲1,不合法 26 bool minus = false;//考慮正負 27 if (*str == '+') 28 str++; 29 else if (*str == '-') { 30 str++; 31 minus = true; 32 } 33 34 if (*str != '\0') { 35 num = StrToIntCore(str, minus); 36 } 37 } 38 39 return (int) num;//將long long型num轉爲int 40 } 41 42 long long StrToIntCore(const char* digit, bool minus) { 43 long long num = 0; 44 45 while (*digit != '\0') { 46 if (*digit >= '0' && *digit <= '9') { 47 int flag = minus ? -1 : 1; 48 num = num * 10 + flag * (*digit - '0'); 49 //考慮溢出 50 if ((!minus && num > 0x7FFFFFFF) //int所能表示的最大正整數 51 || (minus && num < (signed int) 0x80000000)) { //int所能表示的最小負整數 52 num = 0; 53 break; 54 } 55 56 digit++; 57 } else { 58 num = 0; 59 break; 60 } 61 } 62 63 if (*digit == '\0') { 64 g_nStatus = kValid; 65 } 66 67 return num; 68 } 69 70 // ====================測試代碼==================== 71 void Test(char* string) { 72 int result = StrToInt(string); 73 if (result == 0 && g_nStatus == kInvalid) 74 printf("the input %s is invalid.\n", string); 75 else 76 printf("number for %s is: %d.\n", string, result); 77 } 78 79 int main(int argc, char** argv) { 80 Test(NULL); 81 82 Test(""); 83 84 Test("123"); 85 86 Test("+123"); 87 88 Test("-123"); 89 90 Test("1a33"); 91 92 Test("+0"); 93 94 Test("-0"); 95 96 //有效的最大正整數, 0x7FFFFFFF 97 Test("+2147483647"); 98 99 Test("-2147483647"); 100 101 Test("+2147483648"); 102 103 //有效的最小負整數, 0x80000000 104 Test("-2147483648"); 105 106 Test("+2147483649"); 107 108 Test("-2147483649"); 109 110 Test("+"); 111 112 Test("-"); 113 114 return 0; 115 }