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

C++實(shí)現(xiàn)字符串轉(zhuǎn)整數(shù)(atoi)的代碼詳解

 更新時(shí)間:2025年04月10日 10:58:31   作者:倔強(qiáng)的石頭_  
在編程中,經(jīng)常會遇到將字符串轉(zhuǎn)換為整數(shù)的需求,就像標(biāo)準(zhǔn)庫中的 atoi 函數(shù)一樣,本文給大家介紹了C++中字符串轉(zhuǎn)整數(shù)(atoi)的實(shí)現(xiàn)與解析,并有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下

一、問題描述

在編程中,經(jīng)常會遇到將字符串轉(zhuǎn)換為整數(shù)的需求,就像標(biāo)準(zhǔn)庫中的 atoi 函數(shù)一樣。

本題要求實(shí)現(xiàn)一個(gè) myAtoi 函數(shù),將輸入的字符串轉(zhuǎn)換為 32 位有符號整數(shù),具體規(guī)則如下:

  1. 讀入字符串并丟棄無用的前導(dǎo)空格。
  2. 檢查下一個(gè)字符(假設(shè)還未到字符末尾)為正還是負(fù)號,讀取該字符(如果有)。確定最終結(jié)果是負(fù)數(shù)還是正數(shù)。如果兩者都不存在,則假定結(jié)果為正。
  3. 讀入下一個(gè)字符,直到到達(dá)下一個(gè)非數(shù)字字符或到達(dá)輸入的結(jié)尾。字符串的其余部分將被忽略。
  4. 將前面步驟讀入的這些數(shù)字轉(zhuǎn)換為整數(shù)(即,"123" -> 123, "0032" -> 32)。如果沒有讀入數(shù)字,則整數(shù)為 0 。必要時(shí)更改符號(從步驟 2 開始)。
  5. 如果整數(shù)數(shù)超過 32 位有符號整數(shù)范圍 [−2^31, 2^31 − 1] ,需要截?cái)噙@個(gè)整數(shù),使其保持在這個(gè)范圍內(nèi)。具體來說,小于 −2^31 的整數(shù)應(yīng)該被固定為 −2^31 ,大于 2^31 − 1 的整數(shù)應(yīng)該被固定為 2^31 − 1 。

二、解題思路

為了實(shí)現(xiàn) myAtoi 函數(shù),我們可以按照以下步驟進(jìn)行:

  1. 忽略前導(dǎo)空格:從字符串的開頭開始,跳過所有的空格字符,直到遇到第一個(gè)非空格字符。
  2. 處理符號:檢查第一個(gè)非空格字符是否為 + 或 -,如果是 +,則結(jié)果為正數(shù);如果是 -,則結(jié)果為負(fù)數(shù);如果沒有符號,則默認(rèn)結(jié)果為正數(shù)。
  3. 轉(zhuǎn)換數(shù)字:從符號字符之后開始,依次讀取數(shù)字字符,將其轉(zhuǎn)換為整數(shù)。如果遇到非數(shù)字字符,則停止讀取。
  4. 溢出處理:在轉(zhuǎn)換數(shù)字的過程中,需要檢查是否會發(fā)生溢出。如果結(jié)果超出了 32 位有符號整數(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ù)號
        int i = 0;     // 下標(biāo)
        int ret = 0;   // 結(jié)果
        int size = str.size(); 
 
        // 忽略前導(dǎo)空格
        while (i < size && str[i] == ' ') {
            ++i;
        }
 
        // 處理符號
        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ù)號,初始值為 1,表示正數(shù)。
  • i:用于遍歷字符串的下標(biāo),初始值為 0。
  • ret:用于存儲轉(zhuǎn)換后的整數(shù)結(jié)果,初始值為 0。
  • size:字符串的長度。

2. 忽略前導(dǎo)空格

while (i < size && str[i] == ' ') {
    ++i;
}

使用一個(gè) while 循環(huán),從字符串的開頭開始,跳過所有的空格字符,直到遇到第一個(gè)非空格字符。

3. 處理符號

if (i < size && str[i] == '-') {
    flag = -1;
    ++i;
} else if (i < size && str[i] == '+') {
    ++i;
}

檢查第一個(gè)非空格字符是否為 + 或 -。如果是 -,則將 flag 設(shè)為 -1,表示結(jié)果為負(fù)數(shù);如果是 +,則直接跳過該字符;如果沒有符號,則默認(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),從符號字符之后開始,依次讀取數(shù)字字符。將字符轉(zhuǎn)換為對應(yīng)的數(shù)字 digit,并將其加入到結(jié)果 ret 中。在每次更新 ret 之前,檢查是否會發(fā)生溢出。如果 ret 乘以 10 再加上 digit 會超過 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 用c語言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù)

    用c語言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù)

    本篇文章是對使用c語言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù),用實(shí)例進(jìn)行了分析說明,需要的朋友參考下
    2013-05-05
  • C++中hashmap的一些使用建議

    C++中hashmap的一些使用建議

    由于hashmap不是c++ stl中標(biāo)準(zhǔn)實(shí)現(xiàn),這樣在跨平臺使用時(shí)就可能會出現(xiàn)問題,下面這篇文章主要給大家介紹了關(guān)于C++中hashmap的一些使用建議,需要的朋友可以參考下
    2023-03-03
  • OpenCV實(shí)現(xiàn)可分離濾波

    OpenCV實(shí)現(xiàn)可分離濾波

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)可分離濾波,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言中字符串處理函數(shù)sscanf的用法

    C語言中字符串處理函數(shù)sscanf的用法

    一直對于一些日期字符串中數(shù)字的提取比較頭疼,現(xiàn)看到 sscanf 對于字符串中的內(nèi)容提取較方便,本文主要介紹了C語言中字符串處理函數(shù)sscanf的用法,具有一定參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • C++實(shí)現(xiàn)二叉樹非遞歸遍歷方法實(shí)例總結(jié)

    C++實(shí)現(xiàn)二叉樹非遞歸遍歷方法實(shí)例總結(jié)

    這篇文章主要介紹了C++實(shí)現(xiàn)二叉樹非遞歸遍歷方法實(shí)例總結(jié),是算法設(shè)計(jì)中比較經(jīng)典的一個(gè)遍歷算法,需要的朋友可以參考下
    2014-08-08
  • C/C++ 格式說明符及其用法

    C/C++ 格式說明符及其用法

    在 C/C++ 中,格式說明符(Format Specifiers)主要用于 printf()、scanf() 等輸入輸出函數(shù)中,用于控制數(shù)據(jù)的格式化輸入和輸出,下面給大家介紹C/C++ 格式說明符及其用法,感興趣的朋友一起看看吧
    2025-05-05
  • C語言寫一個(gè)散列表

    C語言寫一個(gè)散列表

    這篇文章主要介紹了C語言寫一個(gè)散列表,散列表,就是下標(biāo)可以為字母的數(shù)組。更多內(nèi)容和小編一起學(xué)習(xí)下面內(nèi)容吧
    2022-01-01
  • 你不知道的C++中namespace和using的用法實(shí)例

    你不知道的C++中namespace和using的用法實(shí)例

    在C++語言編寫的程序中,變量和函數(shù)等的作用范圍是有一定限制的,下面這篇文章主要給大家介紹了一些你不知道的C++中namespace和using的用法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • C語言函數(shù)聲明以及函數(shù)原型超詳細(xì)講解示例

    C語言函數(shù)聲明以及函數(shù)原型超詳細(xì)講解示例

    這篇文章主要介紹了C語言函數(shù)聲明以及函數(shù)原型超詳細(xì)講解,C語言代碼由上到下依次執(zhí)行,原則上函數(shù)定義要出現(xiàn)在函數(shù)調(diào)用之前,否則就會報(bào)錯(cuò)。但在實(shí)際開發(fā)中,經(jīng)常會在函數(shù)定義之前使用它們,這個(gè)時(shí)候就需要提前聲明
    2023-02-02
  • QT6中繪制UI的兩種方法詳解與示例代碼

    QT6中繪制UI的兩種方法詳解與示例代碼

    Qt6 提供了兩種主要的 UI 繪制技術(shù):??QML (Qt Meta-Object Language)?? 和 ??C++ Widgets??,這兩種技術(shù)各有優(yōu)勢,適用于不同的開發(fā)場景,本文將詳細(xì)介紹這兩種技術(shù),并通過示例代碼展示它們的用法,需要的朋友可以參考下
    2025-05-05

最新評論

肇源县| 敦煌市| 新乐市| 关岭| 额尔古纳市| 兴隆县| 会宁县| 仁化县| 增城市| 南涧| 嘉祥县| 伊宁县| 高青县| 咸阳市| 清流县| 阿勒泰市| 神池县| 镇远县| 宣城市| 遂宁市| 玉田县| 陈巴尔虎旗| 崇礼县| 岗巴县| 石嘴山市| 太谷县| 琼海市| 大埔县| 南充市| 建平县| 永顺县| 九江市| 桦南县| 马山县| 永安市| 长治县| 萨嘎县| 桐城市| 西丰县| 紫金县| 建德市|