首頁 > 軟體

C語言中atoi函數模擬實現詳析

2022-10-18 14:00:30

一、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 == '')  //空白字元
	{
		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 == '')  //若字串遍歷完就走這一步,也就意味著該字串的轉換為合法的
	{
		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("合法的轉換:%dn", ret);
	}
	else
		printf("轉換不合法!返回值為:%dn",ret);
	return 0;
}

總結

基本上該函數的模擬實現要注意的細節都在上面的程式碼註釋裡。

還要再解釋的是為什麼要將返回值定義成 long long 長整型,而不是stoi函數的返回值 int 型呢?

這是因為在計算求和的時候萬一出現越界,由於之前將返回值定義為 int 型,這時就會將已經越界的數位強制轉換為非越界的數位,那麼就會導致錯誤的輸出結果和錯誤的合法性判斷。

到此這篇關於C語言中atoi函數模擬實現的文章就介紹到這了,更多相關C語言atoi函數模擬內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com