C語言中atoi函數(shù)模擬實現(xiàn)詳析
一、atoi函數(shù)是什么?
int atoi ( const char * str );
功能:將字符串轉(zhuǎn)換為整數(shù)。
解析C字符串str,將其內(nèi)容解釋為一個整數(shù),該整數(shù)作為int值返回。
該函數(shù)首先丟棄盡可能多的空白字符,直到找到第一個非空白字符。然后,從這個字符開始,取一個可選的初始加號或減號,后面跟著盡可能多的數(shù)字,并將它們解釋為一個數(shù)值。 例:" -123456" 轉(zhuǎn)換為 -123456
字符串可以在構(gòu)成整數(shù)的字符之后包含其他字符,這些字符將被忽略,并且對該函數(shù)的行為沒有影響。例:" 123abc456" 轉(zhuǎn)換為 123,雖然最終的輸出結(jié)果是一個整數(shù),但這屬于非法轉(zhuǎn)換
如果str中的第一個非空白字符序列不是有效的整數(shù),或者由于str為空或只包含空白字符而不存在這樣的序列,則不執(zhí)行轉(zhuǎn)換。例:“abc” " abc" “” 為非法轉(zhuǎn)換,最終會輸出整數(shù)0。
| 字符串 | 整數(shù) | 合法性 |
|---|---|---|
| " 123456" | 123456 | 合法 |
| “-123456” | -123456 | 合法 |
| “123abc456” | 123 | 非法 |
| “abc” | 0 | 非法 |
| “” | 0 | 非法 |
| “2222222222” | 任意值 | 非法 |
注:當轉(zhuǎn)換的值超出int可表示值的范圍時會發(fā)生什么,沒有標準規(guī)范。
例:在VS2013編譯環(huán)境下輸出的數(shù)值

二、atoi函數(shù)模擬實現(xiàn)
#include <stdio.h>
#include <limits.h>
#include <ctype.h>
//通過枚舉設置兩種狀態(tài),分別代表字符串轉(zhuǎn)換的合法性
enum Status
{
VALID, //合法
INVALID //非法
};
enum Status status = INVALID; //定義全局變量 status 為 INVALID,若轉(zhuǎn)換合法,則將 status 變?yōu)?VALID,若非法則不變
int my_atoi(const char* str)
{
if (str == NULL) //字符串為空
{
return 0;
}
if (*str == '\0') //空白字符
{
return 0;
}
while (isspace(*str)) //字符串前面有多余的空格,則一直往后移尋找符號或數(shù)字
{
str++;
}
int flag = 0; //flag 標志數(shù)字的正負
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) //判斷轉(zhuǎn)換后的數(shù)字是否越界
{
return 0;
}
str++;
}
if (*str == '\0') //若字符串遍歷完就走這一步,也就意味著該字符串的轉(zhuǎn)換為合法的
{
status = VALID;
return (int)ret;
}
else //非法轉(zhuǎn)換
{
return (int)ret;
}
}
int main()
{
//int ret = my_atoi("-123");
int ret = my_atoi(" -2222222222");
if (status == VALID)
{
printf("合法的轉(zhuǎn)換:%d\n", ret);
}
else
printf("轉(zhuǎn)換不合法!返回值為:%d\n",ret);
return 0;
}
總結(jié)
基本上該函數(shù)的模擬實現(xiàn)要注意的細節(jié)都在上面的代碼注釋里。
還要再解釋的是為什么要將返回值定義成 long long 長整型,而不是stoi函數(shù)的返回值 int 型呢?
這是因為在計算求和的時候萬一出現(xiàn)越界,由于之前將返回值定義為 int 型,這時就會將已經(jīng)越界的數(shù)字強制轉(zhuǎn)換為非越界的數(shù)字,那么就會導致錯誤的輸出結(jié)果和錯誤的合法性判斷。
到此這篇關于C語言中atoi函數(shù)模擬實現(xiàn)的文章就介紹到這了,更多相關C語言atoi函數(shù)模擬內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C/C++實現(xiàn)對STORM運行信息查看及控制的方法
這篇文章主要介紹了C/C++實現(xiàn)對STORM運行信息查看及控制的方法,需要的朋友可以參考下2014-07-07

