C++:atoi与stoi解析

在C++中,atoi 和 stoi 是用于将字符串转换为整数的函数,但它们来自不同的库,具有不同的行为和特性。

atoi (来自C库)

atoi 是C标准库 <cstdlib> 中的函数,用于将字符串转换为整数。它的原型是:

int atoi(const char *str);
  • 参数:一个指向以空字符('\0')结尾的字符串的指针。该字符串应包含要转换的整数表示形式。
  • 返回值:如果转换成功,函数返回转换后的整数;如果转换失败(例如,字符串不包含可识别的数字或超出了整数的表示范围),则行为是未定义的,但通常返回0。

stoi (来自C++标准库)

stoi 是C++标准库 <string> 中的函数,提供了更安全、更强大的整数转换功能。它的原型是:

int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
  • 参数
    • str:要转换的字符串。
    • pos(可选):一个指向 std::size_t 对象的指针,用于存储第一个非数字字符的位置。如果不需要此信息,可以省略此参数。
    • base(可选):用于解释数字的基数(例如,10表示十进制,16表示十六进制)。默认值为10。
  • 返回值:如果转换成功,函数返回转换后的整数。
  • 异常:如果转换失败(例如,字符串不包含可识别的数字,或者数字超出了整数的表示范围),则抛出 std::invalid_argument 或 std::out_of_range 异常。

示例

atoi 示例
#include <cstdlib>  
#include <iostream>  
  
int main() {  
    const char* str = "12345";  
    int num = atoi(str);  
    std::cout << "Number: " << num << std::endl; // 输出: Number: 12345  
  
    const char* badStr = "abc";  
    int badNum = atoi(badStr); // 未定义行为,但通常返回0  
    std::cout << "Bad Number: " << badNum << std::endl; // 输出可能是: Bad Number: 0  
  
    return 0;  
}
stoi 示例
#include <string>  
#include <iostream>  
  
int main() {  
    std::string str = "12345";  
    int num = std::stoi(str);  
    std::cout << "Number: " << num << std::endl; // 输出: Number: 12345  
  
    std::string badStr = "abc";  
    try {  
        int badNum = std::stoi(badStr); // 抛出 std::invalid_argument 异常  
    } catch (const std::invalid_argument& e) {  
        std::cerr << "Invalid argument: " << e.what() << std::endl; // 输出错误信息  
    }  
  
    std::string tooBigStr = "12345678901234567890"; // 假设int类型为32位,这将超出范围  
    try {  
        int tooBigNum = std::stoi(tooBigStr); // 抛出 std::out_of_range 异常  
    } catch (const std::out_of_range& e) {  
        std::cerr << "Out of range: " << e.what() << std::endl; // 输出错误信息  
    }  
  
    return 0;  
}

总结

  • atoi 提供了简单的整数转换功能,但缺乏错误处理机制,并且在转换失败时行为是未定义的。
  • stoi 提供了更强大、更安全的整数转换功能,包括错误处理和可选的基数参数。当处理用户输入或不确定的字符串时,使用 stoi 通常更为安全。
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值