C++实现字符串转整数(atoi)的代码详解

 更新时间:2025年04月10日 10:58:31   作者:倔强的石头_  
在编程中,经常会遇到将字符串转换为整数的需求,就像标准库中的 atoi 函数一样,本文给大家介绍了C++中字符串转整数(atoi)的实现与解析,并有详细的代码示例供大家参考,需要的朋友可以参考下

一、问题描述

在编程中,经常会遇到将字符串转换为整数的需求,就像标准库中的 atoi 函数一样。

本题要求实现一个 myAtoi 函数,将输入的字符串转换为 32 位有符号整数,具体规则如下:

  1. 读入字符串并丢弃无用的前导空格。
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −2^31 ,大于 2^31 − 1 的整数应该被固定为 2^31 − 1 。

二、解题思路

为了实现 myAtoi 函数,我们可以按照以下步骤进行:

  1. 忽略前导空格:从字符串的开头开始,跳过所有的空格字符,直到遇到第一个非空格字符。
  2. 处理符号:检查第一个非空格字符是否为 + 或 -,如果是 +,则结果为正数;如果是 -,则结果为负数;如果没有符号,则默认结果为正数。
  3. 转换数字:从符号字符之后开始,依次读取数字字符,将其转换为整数。如果遇到非数字字符,则停止读取。
  4. 溢出处理:在转换数字的过程中,需要检查是否会发生溢出。如果结果超出了 32 位有符号整数的范围,则需要截断结果。

三、代码实现

#include <iostream>
#include <string>
#include <climits>
 
class Solution {
public:
    int myAtoi(std::string str) 
    {
        int flag = 1;  // 正负号
        int i = 0;     // 下标
        int ret = 0;   // 结果
        int size = str.size(); 
 
        // 忽略前导空格
        while (i < size && str[i] == ' ') {
            ++i;
        }
 
        // 处理符号
        if (i < size && str[i] == '-') {
            flag = -1;
            ++i;
        } else if (i < size && str[i] == '+') {
            ++i;
        }
 
        // 转换数字
        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:用于记录结果的正负号,初始值为 1,表示正数。
  • i:用于遍历字符串的下标,初始值为 0。
  • ret:用于存储转换后的整数结果,初始值为 0。
  • size:字符串的长度。

2. 忽略前导空格

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

使用一个 while 循环,从字符串的开头开始,跳过所有的空格字符,直到遇到第一个非空格字符。

3. 处理符号

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

检查第一个非空格字符是否为 + 或 -。如果是 -,则将 flag 设为 -1,表示结果为负数;如果是 +,则直接跳过该字符;如果没有符号,则默认结果为正数。

4. 转换数字

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;
}

使用一个 while 循环,从符号字符之后开始,依次读取数字字符。将字符转换为对应的数字 digit,并将其加入到结果 ret 中。在每次更新 ret 之前,检查是否会发生溢出。如果 ret 乘以 10 再加上 digit 会超过 INT_MAX,则根据 flag 的值返回 INT_MAX 或 INT_MIN。

5. 返回结果

return flag * ret;

最后,将结果乘以 flag,得到最终的整数结果并返回。

到此这篇关于C++实现字符串转整数(atoi)的代码详解的文章就介绍到这了,更多相关C++字符串转整数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现图形界面双人五子棋游戏

    C++实现图形界面双人五子棋游戏

    这篇文章主要为大家详细介绍了C++实现图形界面双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言中深度优先搜索(DFS)算法的示例详解

    C语言中深度优先搜索(DFS)算法的示例详解

    这篇文章主要通过两个简单的示例为大家详细介绍一下C语言中深度优先搜索(DFS)算法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-02-02
  • Visual Studio 2022配置fftw第三方库的详细过程

    Visual Studio 2022配置fftw第三方库的详细过程

    FFTW是一个可以进行可变长度一维或多维DFT的开源C程序库,是目前最快的FFT算法实现,本文简述了在Windows平台上,如何在C++中调用FFTW,所使用的IDE为Visual Studio 2022,感兴趣的朋友一起看看吧
    2024-06-06
  • 深入了解C++异常处理

    深入了解C++异常处理

    任何东西都可以认为是异常,错误只是异常的一种。本文将带大家了解C++中异常是什么,是如何捕获和处理的等相关知识。文中示例代码简洁易懂,感兴趣的小伙伴可以了解一下
    2021-12-12
  • 聊一聊C++虚函数表的问题

    聊一聊C++虚函数表的问题

    C++是面向对象的语言(与C语言主要区别),所以C++也拥有多态的特性。下面通过代码看下C++虚函数表的问题,感兴趣的朋友一起看看吧
    2021-10-10
  • C语言数据的存储超详细讲解中篇练习

    C语言数据的存储超详细讲解中篇练习

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-04-04
  • C++ 超详细分析多态的原理与实现

    C++ 超详细分析多态的原理与实现

    这篇文章主要介绍了C++多态的原理与实现,多态是一种面向对象的设计思路,本身和C++不是强绑定的,其他语言当中一样有多态,只不过实现的方式可能有所不同。下面来一起了解更多详细内容吧
    2022-03-03
  • 利用C语言编写“剪刀石头布”小游戏

    利用C语言编写“剪刀石头布”小游戏

    这篇文章主要给大家介绍了关于如何利用C语言编写“剪刀石头布”小游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 基于C语言实现三子棋小游戏

    基于C语言实现三子棋小游戏

    这篇文章主要为大家详细介绍了基于C语言实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • VS2019安装cbd调试器的实现步骤

    VS2019安装cbd调试器的实现步骤

    本文主要介绍了VS2019安装cbd调试器的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12

最新评论