国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

用C語言寫一個(gè)函數(shù),把字符串轉(zhuǎn)換成整數(shù)

這篇具有很好參考價(jià)值的文章主要介紹了用C語言寫一個(gè)函數(shù),把字符串轉(zhuǎn)換成整數(shù)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

這是一個(gè)很有意思的問題。請不要把這個(gè)問題想的太簡單了,考慮問題時(shí)應(yīng)該盡可能的全面一些。請先思考并且實(shí)現(xiàn)這個(gè)函數(shù),再來看講解。
用C語言寫一個(gè)函數(shù),把字符串轉(zhuǎn)換成整數(shù)

分析一下:函數(shù)名是StrToInt,那么可以這么調(diào)用:

int ret = StrToInt("1234");
printf("%d\n", ret);

如果你寫的程序能夠正確輸出1234,然后就覺得這道題就這樣了,那么考慮的就不夠全面。有沒有一種可能:

  1. 傳參時(shí)傳了NULL指針。
  2. 傳入空字符串。
  3. 字符串前面有空格,如:" 1234"。
  4. 有正負(fù)號(hào),如:“-1234”。
  5. 有非法字符,如:“1234abcd”。
  6. 數(shù)字太大了,超出了int的存儲(chǔ)范圍,如:“1111111111111111111111111111111111111”。

下面我們一個(gè)一個(gè)解決。

準(zhǔn)備工作

由于有可能出現(xiàn)非法字符,或者空字符串等,會(huì)有一些情況的轉(zhuǎn)換是非法的。所以,定義一個(gè)全局性質(zhì)的枚舉類型來檢驗(yàn)轉(zhuǎn)換是否合法:

enum State
{
	VALID,
	INVALID
}s = INVALID;

默認(rèn)的情況是非法的,只有轉(zhuǎn)換成功才會(huì)把s的值置為VALID。

先把函數(shù)的框架撘出來:

int StrToInt(const char* str)
{

}

接下來開始解決以下問題:

1.NULL指針

NULL指針是不能解引用的!所以最好斷言一下。

int StrToInt(const char* str)
{
	// 如果str是NULL,不能對其解引用
	assert(str != NULL);

	return ret;
}

2.空字符串

如果一上來就遇到了’\0’,那么就是空字符串。

int StrToInt(const char* str)
{
	// 如果str是NULL,不能對其解引用
	assert(str != NULL);

	// 空字符串
	if (*str == '\0')
	{
		return 0;
	}
}

3.空格

接下來,有可能會(huì)遇到空格,使用isspace函數(shù)來判斷,把空格跳過去。

int StrToInt(const char* str)
{
	// 如果str是NULL,不能對其解引用
	assert(str != NULL);

	// 空字符串
	if (*str == '\0')
	{
		return 0;
	}
	// 空格
	while (isspace(*str))
	{
		++str;
	}
}

4.正負(fù)號(hào)

接下來有可能遇到正負(fù)號(hào),用一個(gè)flag來保存。

int StrToInt(const char* str)
{
	// 如果str是NULL,不能對其解引用
	assert(str != NULL);

	// 空字符串
	if (*str == '\0')
	{
		return 0;
	}
	// 空格
	while (isspace(*str))
	{
		++str;
	}
	// 正負(fù)號(hào)
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		++str;
	}
	else if (*str == '-')
	{
		flag = -1;
		++str;
	}
}

5.非法字符

下面開始處理數(shù)字。但是,有可能會(huì)遇到非法字符,所以要先判斷一下。

int StrToInt(const char* str)
{
	// 如果str是NULL,不能對其解引用
	assert(str != NULL);

	// 空字符串
	if (*str == '\0')
	{
		return 0;
	}
	// 空格
	while (isspace(*str))
	{
		++str;
	}
	// 正負(fù)號(hào)
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		++str;
	}
	else if (*str == '-')
	{
		flag = -1;
		++str;
	}

	// 處理數(shù)字
	int ret = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))
		{

		}
		else
		{
			return ret;
		}
	}
}

如何處理合法的數(shù)字呢?假設(shè)是1234,我們可以先定義一個(gè)ret,初始化成0。先拿到1,0*10+1,就得到了1。接著拿到2,1*10+2,就得到了12。再拿到3,12*10+3,就得到了123。最后拿到4,123*10+4,就得到了1234。以此類推。

每次ret = ret*10 + 拿到的數(shù)字就行了。但是“拿到的數(shù)字”是什么呢?就是*str-'0'。想象一下,'1'-'0'就是數(shù)字1,'6'-'0'就是數(shù)字6。兩個(gè)字符相減就是對應(yīng)的ASCII碼相減。不過,拿到的數(shù)字得乘上flag再加上去,因?yàn)橛锌赡苁秦?fù)數(shù)。

int StrToInt(const char* str)
{
	// 如果str是NULL,不能對其解引用
	assert(str != NULL);

	// 空字符串
	if (*str == '\0')
	{
		return 0;
	}
	// 空格
	while (isspace(*str))
	{
		++str;
	}
	// 正負(fù)號(hào)
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		++str;
	}
	else if (*str == '-')
	{
		flag = -1;
		++str;
	}

	// 處理數(shù)字
	int ret = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))
		{
			ret = ret * 10 + flag * (*str - '0');
			++str;
		}
		else
		{
			return ret;
		}
	}

	s = VALID;
	return ret;
}

6.越界

這就完了嗎?還有一種情況,假設(shè)傳入的數(shù)字過大或過小,導(dǎo)致超出了int的存儲(chǔ)范圍,此時(shí)的轉(zhuǎn)換也是非法的。判斷方法,就是用更大的類型,如long long來存儲(chǔ),如果超出了int的存儲(chǔ)范圍(ret>INT_MAX || ret<INT_MIN),但是不會(huì)超出long long的存儲(chǔ)范圍,就能夠識(shí)別什么時(shí)候越界了。

int StrToInt(const char* str)
{
	// 如果str是NULL,不能對其解引用
	assert(str != NULL);

	// 空字符串
	if (*str == '\0')
	{
		return 0;
	}
	// 空格
	while (isspace(*str))
	{
		++str;
	}
	// 正負(fù)號(hào)
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		++str;
	}
	else if (*str == '-')
	{
		flag = -1;
		++str;
	}

	// 處理數(shù)字
	long long ret = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))
		{
			ret = ret * 10 + flag * (*str - '0');
			// 判斷有沒有超過int的存儲(chǔ)范圍
			if (ret > INT_MAX || ret < INT_MIN)
			{
				return (int)ret;
			}
			else
			{
				++str;
			}
		}
		else
		{
			return (int)ret;
		}
	} // end of while

	s = VALID;
	return (int)ret;
}

最后如果轉(zhuǎn)換成功,就把s置成VALID,再返回ret即可。注意ret是long long類型,但是返回類型是int,所以需要強(qiáng)制類型轉(zhuǎn)換。

測試

完整的測試代碼如下:

#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <limits.h>

enum State
{
	VALID,
	INVALID
}s = INVALID;

int StrToInt(const char* str)
{
	// 如果str是NULL,不能對其解引用
	assert(str != NULL);

	// 空字符串
	if (*str == '\0')
	{
		return 0;
	}
	// 空格
	while (isspace(*str))
	{
		++str;
	}
	// 正負(fù)號(hào)
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		++str;
	}
	else if (*str == '-')
	{
		flag = -1;
		++str;
	}

	// 處理數(shù)字
	long long ret = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))
		{
			ret = ret * 10 + flag * (*str - '0');
			// 判斷有沒有超過int的存儲(chǔ)范圍
			if (ret > INT_MAX || ret < INT_MIN)
			{
				return (int)ret;
			}
			else
			{
				++str;
			}
		}
		else
		{
			return (int)ret;
		}
	} // end of while

	s = VALID;
	return (int)ret;
}

int main()
{
	int ret = StrToInt("      -1234");
	if (s == VALID)
	{
		printf("轉(zhuǎn)換成功:%d\n", ret);
	}
	else
	{
		printf("轉(zhuǎn)換失?。?d\n", ret);
	}

	return 0;
}

輸出結(jié)果:
用C語言寫一個(gè)函數(shù),把字符串轉(zhuǎn)換成整數(shù)

總結(jié)

  1. 每次把舊的數(shù)乘10再加上一個(gè)數(shù)字,就能在這個(gè)數(shù)后面續(xù)上這個(gè)數(shù)字。如123*10+4=1234,就在123后面續(xù)上了4。
  2. 字符相減,本質(zhì)是ASCII碼相減。
  3. 考慮問題時(shí),應(yīng)該全面考慮,不要漏掉一些情況。

感謝大家的閱讀!文章來源地址http://www.zghlxwxcb.cn/news/detail-408664.html

到了這里,關(guān)于用C語言寫一個(gè)函數(shù),把字符串轉(zhuǎn)換成整數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • LeetCode-字符串轉(zhuǎn)換整數(shù)atoi(8)

    LeetCode-字符串轉(zhuǎn)換整數(shù)atoi(8)

    請你來實(shí)現(xiàn)一個(gè) myAtoi(string s) 函數(shù),使其能將字符串轉(zhuǎn)換成一個(gè) 32 位有符號(hào)整數(shù)(類似 C/C++ 中的 atoi 函數(shù))。 函數(shù) myAtoi(string s) 的算法如下: 讀入字符串并丟棄無用的前導(dǎo)空格 檢查下一個(gè)字符(假設(shè)還未到字符末尾)為正還是負(fù)號(hào),讀取該字符(如果有)。 確定最終結(jié)果

    2024年01月16日
    瀏覽(26)
  • Leetcode 8. 字符串轉(zhuǎn)換整數(shù) (atoi)

    請你來實(shí)現(xiàn)一個(gè) myAtoi(string s) 函數(shù),使其能將字符串轉(zhuǎn)換成一個(gè) 32 位有符號(hào)整數(shù)(類似 C/C++ 中的 atoi 函數(shù))。 函數(shù) myAtoi(string s) 的算法如下: 讀入字符串并丟棄無用的前導(dǎo)空格 檢查下一個(gè)字符(假設(shè)還未到字符末尾)為正還是負(fù)號(hào),讀取該字符(如果有)。 確定最終結(jié)果

    2024年04月09日
    瀏覽(26)
  • C語言:寫一個(gè)函數(shù),求字符串的長度,在main函數(shù)中輸入字符串并輸出其長度(指針)

    C語言:寫一個(gè)函數(shù),求字符串的長度,在main函數(shù)中輸入字符串并輸出其長度(指針)

    分析: ? ?在程序中,定義一個(gè)函數(shù) fix,該函數(shù)使用指針變量來訪問字符串中的每個(gè)字符,并計(jì)算出字符串的長度。fix 函數(shù)的參數(shù)為指向 char 類型的指針變量 p,表示需要計(jì)算長度的字符串。 ? 在主函數(shù) main 中,定義一個(gè)大小為 20 的字符數(shù)組 a,用于存儲(chǔ)輸入的字符串。然

    2024年01月21日
    瀏覽(106)
  • 【C語言_題庫】C語言:編寫一個(gè)程序,輸入一組字符串,將字符串中的小寫字母轉(zhuǎn)換為大寫字母,其它字符不變,并輸出。

    【C語言_題庫】C語言:編寫一個(gè)程序,輸入一組字符串,將字符串中的小寫字母轉(zhuǎn)換為大寫字母,其它字符不變,并輸出。

    【問題描述】 從鍵盤輸入一行英文字符串,把所有小寫字母變成大寫字母,其他字母和字符保持不變。 【輸入形式】 輸入一行字符串,含大小寫。 【輸出形式】 輸出大寫字母形式。 【樣例輸入①】 hello,world. 【樣例輸出①】 result:HELLO,WORLD. 【樣例輸入②】 hello,China. 【樣例

    2024年02月07日
    瀏覽(573)
  • 【LeetCode】字符串轉(zhuǎn)換整數(shù) (atoi) [M](模擬)

    8. 字符串轉(zhuǎn)換整數(shù) (atoi) - 力扣(LeetCode) 請你來實(shí)現(xiàn)一個(gè)?myAtoi(string s)?函數(shù),使其能將字符串轉(zhuǎn)換成一個(gè) 32 位有符號(hào)整數(shù)(類似 C/C++ 中的 atoi 函數(shù))。 函數(shù)?myAtoi(string s) 的算法如下: 讀入字符串并丟棄無用的前導(dǎo)空格 檢查下一個(gè)字符(假設(shè)還未到字符末尾)為正還是負(fù)

    2024年02月07日
    瀏覽(27)
  • C++中如何將string(字符串)轉(zhuǎn)換為int(整數(shù))

    C++ 編程語言有一些內(nèi)置數(shù)據(jù)類型: int , 對于整數(shù)(例如 10、150) double ,對于浮點(diǎn)數(shù)(例如 5.0、4.5) char ,對于單個(gè)字符(例如“D”、“!”) string ,對于字符序列(例如“Hello”) bool , 對于布爾值(true 或 false) C++ 是一種 強(qiáng)類型 編程語言,這意味著當(dāng)您創(chuàng)建變量時(shí),你

    2024年02月06日
    瀏覽(88)
  • 【LeetCode-中等】劍指 Offer 67. 把字符串轉(zhuǎn)換成整數(shù)(詳解)

    【LeetCode-中等】劍指 Offer 67. 把字符串轉(zhuǎn)換成整數(shù)(詳解)

    寫一個(gè)函數(shù) StrToInt,實(shí)現(xiàn)把字符串轉(zhuǎn)換成整數(shù)這個(gè)功能。不能使用 atoi 或者其他類似的庫函數(shù)。 首先,該函數(shù)會(huì)根據(jù)需要丟棄無用的開頭空格字符,直到尋找到第一個(gè)非空格的字符為止。 當(dāng)我們尋找到的第一個(gè)非空字符為正或者負(fù)號(hào)時(shí),則將該符號(hào)與之后面盡可能多的連續(xù)

    2024年02月15日
    瀏覽(25)
  • 匯編語言(Assembly Language)習(xí)題:鍵盤輸入一個(gè)字符串,試將其中的小寫字母轉(zhuǎn)換為大寫字母,其它字符保持不變。

    匯編語言(Assembly Language)習(xí)題:鍵盤輸入一個(gè)字符串,試將其中的小寫字母轉(zhuǎn)換為大寫字母,其它字符保持不變。

    前置知識(shí):匯編語言常用系統(tǒng)功能調(diào)用(如果懂直接跳過看題目詳解) 格式: 功能:從鍵盤輸入字符的ASCII碼送入寄存器AL中,并送顯示器顯示。 格式: 功能:將DL寄存器中的字符送顯示器顯示,如果DL中為〈CTRL〉+〈BREAK〉的ASCII碼,則退出。 格式: 功能:將DL寄存器中的字

    2024年02月03日
    瀏覽(97)
  • (其他) 劍指 Offer 67. 把字符串轉(zhuǎn)換成整數(shù) ——【Leetcode每日一題】

    (其他) 劍指 Offer 67. 把字符串轉(zhuǎn)換成整數(shù) ——【Leetcode每日一題】

    難度:中等 寫一個(gè)函數(shù) StrToInt,實(shí)現(xiàn)把字符串轉(zhuǎn)換成整數(shù)這個(gè)功能。不能使用 atoi 或者其他類似的庫函數(shù)。 首先,該函數(shù)會(huì)根據(jù)需要丟棄無用的開頭空格字符,直到尋找到第一個(gè)非空格的字符為止。 當(dāng)我們尋找到的第一個(gè)非空字符為正或者負(fù)號(hào)時(shí),則將該符號(hào)與之后面盡可

    2024年02月09日
    瀏覽(27)
  • Java——它要求用戶輸入一個(gè)整數(shù)(實(shí)際上是一個(gè)字符串),然后計(jì)算該整數(shù)的平方值,并將結(jié)果輸出。

    Java——它要求用戶輸入一個(gè)整數(shù)(實(shí)際上是一個(gè)字符串),然后計(jì)算該整數(shù)的平方值,并將結(jié)果輸出。

    這是一個(gè)Java程序,它要求用戶輸入一個(gè)整數(shù)(實(shí)際上是一個(gè)字符串),然后計(jì)算該整數(shù)的平方值,并將結(jié)果輸出。程序的基本流程如下: 首先,聲明并初始化變量data和result,它們的初始值都為0。 然后,輸出提示信息,要求用戶輸入一個(gè)整數(shù)。 接下來,使用BufferedReader類從

    2024年02月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包