字符串转换整数

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [231,  2311]。如果数值超过这个范围,请返回  INT_MAX (2311) 或 INT_MIN (231) 。

示例 1:

输入: "42"
输出: 42
示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。
示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (231)
class Solution:
    def myAtoi(self, str: str) -> int:
        str = str.strip(' ')
        numlist = []
        length = len(str)
        if length == 0:
            return 0
        if str[0].isalpha():
            return 0
        if str[0] == '+' or str[0] == '-':
            numlist.append(str[0])
            str = str[1:]
        length = len(str)
        if length == 0:
            return 0
        if not str[0].isdigit():
            return 0
        i = 0
        while i < length:
            if not str[i].isdigit():
                break
            numlist.append(str[i])
            i += 1
        number = int(''.join(numlist))
        if number <= -2147483648:
            return -2147483648
        elif number >= 2147483647:
            return 2147483647
        else:
            return number
在C++中,将字符串转换整数可以通过多种方法实现。以下是几种常用的方式: 1. **使用标准库函数 `atoi()`** `atoi()` 是 C 标准库中的一个函数,用于将字符串转换整数。该函数在 `<cstdlib>` 头文件中定义。如果字符串以数字开头,则会将其转换整数;若字符串中包含非数字字符,则会在第一个非数字字符处停止转换。 ```cpp #include <iostream> #include <cstdlib> using namespace std; int main() { const char* str = "12345"; int num = atoi(str); cout << "转换后的整数为:" << num << endl; return 0; } ``` 如果字符串无法转换整数(例如包含非数字字符),`atoi()` 会返回 0。需要注意的是,该方法无法处理字符串开头的空格和负号以外的其他字符。 2. **使用 `std::stoi()` 函数** `std::stoi()` 是 C++11 引入的字符串转换函数,定义在 `<string>` 头文件中。相比 `atoi()`,`std::stoi()` 提供了更好的错误处理机制。 ```cpp #include <iostream> #include <string> using namespace std; int main() { string str = "12345"; int num = stoi(str); cout << "转换后的整数为:" << num << endl; return 0; } ``` 该函数支持字符串开头的空格,并能处理负数。如果字符串无法转换,会抛出异常(如 `invalid_argument` 或 `out_of_range`)。 3. **手动实现转换逻辑** 如果希望了解字符串转换整数的具体过程,可以手动实现逻辑。以下代码演示了如何将字符串逐个字符转换整数,并考虑负数的情况[^1]: ```cpp #include <iostream> using namespace std; int customStoi(const char* str) { int num = 0; int sign = 1; int i = 0; if (str[0] == '-') { sign = -1; i++; } while (str[i] != '\0') { if (str[i] >= '0' && str[i] <= '9') { num = num * 10 + (str[i] - '0'); } else { break; // 遇到非数字字符停止转换 } i++; } return num * sign; } int main() { const char* str = "-12345"; int num = customStoi(str); cout << "转换后的整数为:" << num << endl; return 0; } ``` 4. **使用 `sscanf()` 函数** `sscanf()` 是 C 标准库中的一个函数,可以从字符串中读取格式化输入。它在 `<cstdio>` 头文件中定义。 ```cpp #include <iostream> #include <cstdio> using namespace std; int main() { const char* str = "12345"; int num; sscanf(str, "%d", &num); cout << "转换后的整数为:" << num << endl; return 0; } ``` 该方法适用于字符串中包含格式化数据的情况。 ### 注意事项 - 在使用 `atoi()` 或 `std::stoi()` 时,需要确保字符串内容符合整数格式要求,否则可能导致错误或异常。 - 如果字符串包含前导空格或非法字符,需要在转换前进行清理或验证。 ### 示例输出 假设输入字符串为 `"12345"`,上述方法的输出结果为: ``` 转换后的整数为:12345 ``` 如果输入字符串为 `"-12345"`,输出结果为: ``` 转换后的整数为:-12345 ``` ### 总结 C++ 提供了多种方式将字符串转换整数,包括使用标准库函数、手动实现逻辑等。选择合适的方法取决于具体需求,例如是否需要处理错误或支持负数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值