最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中atoi函數(shù)模擬實(shí)現(xiàn)詳析

 更新時(shí)間:2022年10月16日 14:13:13   作者:情話0.0  
atoi函數(shù)功能是將數(shù)字字符串轉(zhuǎn)換為整數(shù),比如數(shù)字字符串"12345"被atoi轉(zhuǎn)換為12345,數(shù)字字符串"-12345"被轉(zhuǎn)換為-12345,下面這篇文章主要給大家介紹了關(guān)于C語言中atoi函數(shù)模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下

一、atoi函數(shù)是什么?

int atoi ( const char * str );

功能:將字符串轉(zhuǎn)換為整數(shù)。

解析C字符串str,將其內(nèi)容解釋為一個(gè)整數(shù),該整數(shù)作為int值返回。

該函數(shù)首先丟棄盡可能多的空白字符,直到找到第一個(gè)非空白字符。然后,從這個(gè)字符開始,取一個(gè)可選的初始加號(hào)或減號(hào),后面跟著盡可能多的數(shù)字,并將它們解釋為一個(gè)數(shù)值。 例:" -123456" 轉(zhuǎn)換為 -123456

字符串可以在構(gòu)成整數(shù)的字符之后包含其他字符,這些字符將被忽略,并且對(duì)該函數(shù)的行為沒有影響。例:" 123abc456" 轉(zhuǎn)換為 123,雖然最終的輸出結(jié)果是一個(gè)整數(shù),但這屬于非法轉(zhuǎn)換

如果str中的第一個(gè)非空白字符序列不是有效的整數(shù),或者由于str為空或只包含空白字符而不存在這樣的序列,則不執(zhí)行轉(zhuǎn)換。例:“abc” " abc" “” 為非法轉(zhuǎn)換,最終會(huì)輸出整數(shù)0。

字符串整數(shù)合法性
" 123456"123456合法
“-123456”-123456合法
“123abc456”123非法
“abc”0非法
“”0非法
“2222222222”任意值非法

注:當(dāng)轉(zhuǎn)換的值超出int可表示值的范圍時(shí)會(huì)發(fā)生什么,沒有標(biāo)準(zhǔn)規(guī)范。

例:在VS2013編譯環(huán)境下輸出的數(shù)值

二、atoi函數(shù)模擬實(shí)現(xiàn)

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

//通過枚舉設(shè)置兩種狀態(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))  //字符串前面有多余的空格,則一直往后移尋找符號(hào)或數(shù)字
	{
		str++;
	}
	int flag = 0;  //flag 標(biāo)志數(shù)字的正負(fù)
	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ù)的模擬實(shí)現(xiàn)要注意的細(xì)節(jié)都在上面的代碼注釋里。

還要再解釋的是為什么要將返回值定義成 long long 長(zhǎng)整型,而不是stoi函數(shù)的返回值 int 型呢?

這是因?yàn)樵谟?jì)算求和的時(shí)候萬一出現(xiàn)越界,由于之前將返回值定義為 int 型,這時(shí)就會(huì)將已經(jīng)越界的數(shù)字強(qiáng)制轉(zhuǎn)換為非越界的數(shù)字,那么就會(huì)導(dǎo)致錯(cuò)誤的輸出結(jié)果和錯(cuò)誤的合法性判斷。

到此這篇關(guān)于C語言中atoi函數(shù)模擬實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語言atoi函數(shù)模擬內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 字符串去重排序?qū)嵗a

    C++ 字符串去重排序?qū)嵗a

    這篇文章主要介紹了C++ 字符串去重排序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C/C++實(shí)現(xiàn)對(duì)STORM運(yùn)行信息查看及控制的方法

    C/C++實(shí)現(xiàn)對(duì)STORM運(yùn)行信息查看及控制的方法

    這篇文章主要介紹了C/C++實(shí)現(xiàn)對(duì)STORM運(yùn)行信息查看及控制的方法,需要的朋友可以參考下
    2014-07-07
  • C++中異常機(jī)制的實(shí)現(xiàn)機(jī)制詳解

    C++中異常機(jī)制的實(shí)現(xiàn)機(jī)制詳解

    這篇文章主要給大家介紹了關(guān)于C++中異常機(jī)制的實(shí)現(xiàn)機(jī)制的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • C語言教程之?dāng)?shù)組詳解

    C語言教程之?dāng)?shù)組詳解

    這篇文章主要為大家介紹了C語言教程之?dāng)?shù)組,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 解決 VSCode 編寫 C++11 代碼報(bào)紅問題分析

    解決 VSCode 編寫 C++11 代碼報(bào)紅問題分析

    今天在寫 C++ 代碼的時(shí)候用上 C++11 的特性,然后發(fā)現(xiàn) VSCode 雖然可以編譯通過,但是會(huì)在相應(yīng)位置報(bào)紅,這是怎么回事呢?下面小編給大家?guī)砹私鉀Q方法,一起看看吧
    2021-09-09
  • C++ HLSL實(shí)現(xiàn)簡(jiǎn)單的圖像處理功能

    C++ HLSL實(shí)現(xiàn)簡(jiǎn)單的圖像處理功能

    本文主要介紹了HLSL實(shí)現(xiàn)簡(jiǎn)單的圖像處理功能的方法,具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • C語言實(shí)現(xiàn)文件操作實(shí)例(簡(jiǎn)單圖示講解)

    C語言實(shí)現(xiàn)文件操作實(shí)例(簡(jiǎn)單圖示講解)

    與普通文件載體不同,文件是以硬盤為載體存儲(chǔ)在計(jì)算機(jī)上的信息集合,文件可以是文本文檔、圖片、程序等等,下面這篇文章主要給大家介紹了關(guān)于C語言實(shí)現(xiàn)文件操作實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 一篇文章帶你了解C++模板編程詳解

    一篇文章帶你了解C++模板編程詳解

    這篇文章主要介紹了C++的模板,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • C++函數(shù)模板與重載解析超詳細(xì)講解

    C++函數(shù)模板與重載解析超詳細(xì)講解

    模板是C++最重要的設(shè)計(jì)。這篇文章講的是函數(shù)模板,只是簡(jiǎn)單介紹模板的一些功能,關(guān)于模板的更多的內(nèi)容會(huì)在類模板中詳細(xì)介紹。文章還著重介紹了重載解析過程
    2022-08-08
  • C++ 的三種訪問權(quán)限與三種繼承方式

    C++ 的三種訪問權(quán)限與三種繼承方式

    我們知道C++中的類,有三種訪問權(quán)限(也稱作訪問控制),它們分別是public、protected、private,C++中繼承的方式還有多種。下面通過本文給大家詳細(xì)介紹,對(duì)c++中的訪問權(quán)限和繼承方式感興趣的朋友一起看看吧
    2016-11-11

最新評(píng)論

宜兰市| 黑山县| 崇仁县| 大厂| 汶川县| 岳西县| 名山县| 大同县| 个旧市| 安国市| 平阳县| 肥东县| 观塘区| 弥渡县| 当雄县| 自治县| 扶余县| 肥乡县| 社会| 龙门县| 鄂州市| 玉溪市| 嵊州市| 松江区| 阿鲁科尔沁旗| 清原| 上思县| 湟中县| 金寨县| 林州市| 崇阳县| 阿拉善右旗| 唐海县| 阿克陶县| 康保县| 蒙山县| 监利县| 周宁县| 延川县| 洮南市| 泰顺县|