C++實(shí)現(xiàn)字符串轉(zhuǎn)整數(shù)(atoi)的代碼詳解
一、問(wèn)題描述
在編程中,經(jīng)常會(huì)遇到將字符串轉(zhuǎn)換為整數(shù)的需求,就像標(biāo)準(zhǔn)庫(kù)中的 atoi 函數(shù)一樣。
本題要求實(shí)現(xiàn)一個(gè) myAtoi 函數(shù),將輸入的字符串轉(zhuǎn)換為 32 位有符號(hào)整數(shù),具體規(guī)則如下:
- 讀入字符串并丟棄無(wú)用的前導(dǎo)空格。
- 檢查下一個(gè)字符(假設(shè)還未到字符末尾)為正還是負(fù)號(hào),讀取該字符(如果有)。確定最終結(jié)果是負(fù)數(shù)還是正數(shù)。如果兩者都不存在,則假定結(jié)果為正。
- 讀入下一個(gè)字符,直到到達(dá)下一個(gè)非數(shù)字字符或到達(dá)輸入的結(jié)尾。字符串的其余部分將被忽略。
- 將前面步驟讀入的這些數(shù)字轉(zhuǎn)換為整數(shù)(即,"123" -> 123, "0032" -> 32)。如果沒(méi)有讀入數(shù)字,則整數(shù)為 0 。必要時(shí)更改符號(hào)(從步驟 2 開(kāi)始)。
- 如果整數(shù)數(shù)超過(guò) 32 位有符號(hào)整數(shù)范圍
[−2^31, 2^31 − 1],需要截?cái)噙@個(gè)整數(shù),使其保持在這個(gè)范圍內(nèi)。具體來(lái)說(shuō),小于−2^31的整數(shù)應(yīng)該被固定為−2^31,大于2^31 − 1的整數(shù)應(yīng)該被固定為2^31 − 1。
二、解題思路
為了實(shí)現(xiàn) myAtoi 函數(shù),我們可以按照以下步驟進(jìn)行:
- 忽略前導(dǎo)空格:從字符串的開(kāi)頭開(kāi)始,跳過(guò)所有的空格字符,直到遇到第一個(gè)非空格字符。
- 處理符號(hào):檢查第一個(gè)非空格字符是否為
+或-,如果是+,則結(jié)果為正數(shù);如果是-,則結(jié)果為負(fù)數(shù);如果沒(méi)有符號(hào),則默認(rèn)結(jié)果為正數(shù)。 - 轉(zhuǎn)換數(shù)字:從符號(hào)字符之后開(kāi)始,依次讀取數(shù)字字符,將其轉(zhuǎn)換為整數(shù)。如果遇到非數(shù)字字符,則停止讀取。
- 溢出處理:在轉(zhuǎn)換數(shù)字的過(guò)程中,需要檢查是否會(huì)發(fā)生溢出。如果結(jié)果超出了 32 位有符號(hào)整數(shù)的范圍,則需要截?cái)嘟Y(jié)果。
三、代碼實(shí)現(xiàn)
#include <iostream>
#include <string>
#include <climits>
class Solution {
public:
int myAtoi(std::string str)
{
int flag = 1; // 正負(fù)號(hào)
int i = 0; // 下標(biāo)
int ret = 0; // 結(jié)果
int size = str.size();
// 忽略前導(dǎo)空格
while (i < size && str[i] == ' ') {
++i;
}
// 處理符號(hào)
if (i < size && str[i] == '-') {
flag = -1;
++i;
} else if (i < size && str[i] == '+') {
++i;
}
// 轉(zhuǎn)換數(shù)字
while (i < size && str[i] >= '0' && str[i] <= '9') {
int digit = str[i] - '0';
// 檢查溢出
if (ret > (INT_MAX - digit) / 10) {
return flag == 1 ? INT_MAX : INT_MIN;
}
ret = ret * 10 + digit;
++i;
}
return flag * ret;
}
};
int main() {
Solution sol;
std::string input = " -42";
std::cout << sol.myAtoi(input) << std::endl;
return 0;
}四、代碼邏輯詳解
1. 變量初始化
flag:用于記錄結(jié)果的正負(fù)號(hào),初始值為 1,表示正數(shù)。i:用于遍歷字符串的下標(biāo),初始值為 0。ret:用于存儲(chǔ)轉(zhuǎn)換后的整數(shù)結(jié)果,初始值為 0。size:字符串的長(zhǎng)度。
2. 忽略前導(dǎo)空格
while (i < size && str[i] == ' ') {
++i;
}使用一個(gè) while 循環(huán),從字符串的開(kāi)頭開(kāi)始,跳過(guò)所有的空格字符,直到遇到第一個(gè)非空格字符。
3. 處理符號(hào)
if (i < size && str[i] == '-') {
flag = -1;
++i;
} else if (i < size && str[i] == '+') {
++i;
}檢查第一個(gè)非空格字符是否為 + 或 -。如果是 -,則將 flag 設(shè)為 -1,表示結(jié)果為負(fù)數(shù);如果是 +,則直接跳過(guò)該字符;如果沒(méi)有符號(hào),則默認(rèn)結(jié)果為正數(shù)。
4. 轉(zhuǎn)換數(shù)字
while (i < size && str[i] >= '0' && str[i] <= '9') {
int digit = str[i] - '0';
// 檢查溢出
if (ret > (INT_MAX - digit) / 10) {
return flag == 1 ? INT_MAX : INT_MIN;
}
ret = ret * 10 + digit;
++i;
}使用一個(gè) while 循環(huán),從符號(hào)字符之后開(kāi)始,依次讀取數(shù)字字符。將字符轉(zhuǎn)換為對(duì)應(yīng)的數(shù)字 digit,并將其加入到結(jié)果 ret 中。在每次更新 ret 之前,檢查是否會(huì)發(fā)生溢出。如果 ret 乘以 10 再加上 digit 會(huì)超過(guò) INT_MAX,則根據(jù) flag 的值返回 INT_MAX 或 INT_MIN。
5. 返回結(jié)果
return flag * ret;
最后,將結(jié)果乘以 flag,得到最終的整數(shù)結(jié)果并返回。
到此這篇關(guān)于C++實(shí)現(xiàn)字符串轉(zhuǎn)整數(shù)(atoi)的代碼詳解的文章就介紹到這了,更多相關(guān)C++字符串轉(zhuǎn)整數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中深度優(yōu)先搜索(DFS)算法的示例詳解
這篇文章主要通過(guò)兩個(gè)簡(jiǎn)單的示例為大家詳細(xì)介紹一下C語(yǔ)言中深度優(yōu)先搜索(DFS)算法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02
Visual Studio 2022配置fftw第三方庫(kù)的詳細(xì)過(guò)程
FFTW是一個(gè)可以進(jìn)行可變長(zhǎng)度一維或多維DFT的開(kāi)源C程序庫(kù),是目前最快的FFT算法實(shí)現(xiàn),本文簡(jiǎn)述了在Windows平臺(tái)上,如何在C++中調(diào)用FFTW,所使用的IDE為Visual Studio 2022,感興趣的朋友一起看看吧2024-06-06
C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解中篇練習(xí)
使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類(lèi)型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類(lèi)型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2022-04-04
C++?超詳細(xì)分析多態(tài)的原理與實(shí)現(xiàn)
這篇文章主要介紹了C++多態(tài)的原理與實(shí)現(xiàn),多態(tài)是一種面向?qū)ο蟮脑O(shè)計(jì)思路,本身和C++不是強(qiáng)綁定的,其他語(yǔ)言當(dāng)中一樣有多態(tài),只不過(guò)實(shí)現(xiàn)的方式可能有所不同。下面來(lái)一起了解更多詳細(xì)內(nèi)容吧2022-03-03
VS2019安裝cbd調(diào)試器的實(shí)現(xiàn)步驟
本文主要介紹了VS2019安裝cbd調(diào)試器的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12

