C語言中atoi函數模擬實現詳析
一、atoi函數是什麼?
int atoi ( const char * str );
功能:將字符串轉換為整數。
解析C字符串str,將其內容解釋為一個整數,該整數作為int值返回。
該函數首先丟棄盡可能多的空白字符,直到找到第一個非空白字符。然後,從這個字符開始,取一個可選的初始加號或減號,後面跟著盡可能多的數字,並將它們解釋為一個數值。 例:" -123456" 轉換為 -123456
字符串可以在構成整數的字符之後包含其他字符,這些字符將被忽略,並且對該函數的行為沒有影響。例:" 123abc456" 轉換為 123,雖然最終的輸出結果是一個整數,但這屬於非法轉換
如果str中的第一個非空白字符序列不是有效的整數,或者由於str為空或隻包含空白字符而不存在這樣的序列,則不執行轉換。例:“abc” " abc" “” 為非法轉換,最終會輸出整數0。
字符串 | 整數 | 合法性 |
---|---|---|
" 123456" | 123456 | 合法 |
“-123456” | -123456 | 合法 |
“123abc456” | 123 | 非法 |
“abc” | 0 | 非法 |
“” | 0 | 非法 |
“2222222222” | 任意值 | 非法 |
註:當轉換的值超出int可表示值的范圍時會發生什麼,沒有標準規范。
例:在VS2013編譯環境下輸出的數值
二、atoi函數模擬實現
#include <stdio.h> #include <limits.h> #include <ctype.h> //通過枚舉設置兩種狀態,分別代表字符串轉換的合法性 enum Status { VALID, //合法 INVALID //非法 }; enum Status status = INVALID; //定義全局變量 status 為 INVALID,若轉換合法,則將 status 變為 VALID,若非法則不變 int my_atoi(const char* str) { if (str == NULL) //字符串為空 { return 0; } if (*str == '\0') //空白字符 { return 0; } while (isspace(*str)) //字符串前面有多餘的空格,則一直往後移尋找符號或數字 { str++; } int flag = 0; //flag 標志數字的正負 if (*str == '+') { flag = 1; str++; } else if (*str == '-') { flag = -1; str++; } long long ret = 0; while (isdigit(*str)) { ret = ret * 10 + flag*(*str - '0'); if (ret<INT_MIN || ret>INT_MAX) //判斷轉換後的數字是否越界 { return 0; } str++; } if (*str == '\0') //若字符串遍歷完就走這一步,也就意味著該字符串的轉換為合法的 { status = VALID; return (int)ret; } else //非法轉換 { return (int)ret; } } int main() { //int ret = my_atoi("-123"); int ret = my_atoi(" -2222222222"); if (status == VALID) { printf("合法的轉換:%d\n", ret); } else printf("轉換不合法!返回值為:%d\n",ret); return 0; }
總結
基本上該函數的模擬實現要註意的細節都在上面的代碼註釋裡。
還要再解釋的是為什麼要將返回值定義成 long long 長整型,而不是stoi函數的返回值 int 型呢?
這是因為在計算求和的時候萬一出現越界,由於之前將返回值定義為 int 型,這時就會將已經越界的數字強制轉換為非越界的數字,那麼就會導致錯誤的輸出結果和錯誤的合法性判斷。
到此這篇關於C語言中atoi函數模擬實現的文章就介紹到這瞭,更多相關C語言atoi函數模擬內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++中的atoi 函數簡介
- C/C++的各種字符串函數你知道幾個
- C語言中0、‘\0‘、‘0‘、NULL以及類型轉化
- c語言 數據存儲與原碼 反碼 補碼詳細解析
- C語言字符函數中的isalnum()和iscntrl()你都知道嗎