C++怎么从字符串提取数字 C++ stoi与stod异常处理教程

来源:苹果APP网作者:广州GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《C++怎么从字符串提取数字 C++ stoi与stod异常处理教程》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++怎么从字符串提取数字 C++ stoi与stod异常处理教程》有用,将其分享出去将是对创作者最好的鼓励。

在C++程序开发中,经常需要处理用户输入、文件读取或网络传输得到的字符串数据,从中提取有效的数字信息是高频操作。标准库提供的stoistod函数可以快速完成字符串到整数、浮点数的转换,但若不做好异常处理,遇到非法格式的字符串时程序会直接抛出异常终止运行。

C++怎么从字符串提取数字 C++ stoi与stod异常处理教程

stoi与stod基本用法

stoi用于将字符串转换为int类型整数,stod用于将字符串转换为double类型浮点数,二者都定义在<string>头文件中,基础使用方式如下:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string int_str = "123";
    string double_str = "45.67";
    // 转换字符串为整数
    int num1 = stoi(int_str);
    // 转换字符串为浮点数
    double num2 = stod(double_str);
    cout << "整数结果:" << num1 << endl;
    cout << "浮点数结果:" << num2 << endl;
    return 0;
}

这两个函数会自动忽略字符串开头的空白字符,转换到第一个无法识别为数字字符的位置停止,比如字符串"123abc"用stoi转换会得到123,后面的"abc"会被忽略。

常见异常场景

直接使用stoistod时,遇到以下情况会抛出异常:

  • 字符串中没有任何有效的数字字符,比如"abc"、"中文123"
  • 转换结果超出对应类型的表示范围,比如用stoi转换"9999999999",超出int的最大值范围
  • 字符串格式不符合数字规则,比如"12.3.4"用stod转换时会出现格式错误

异常处理实现方式

可以通过try-catch块捕获stoistod抛出的异常,常见的异常类型有两种:

  • invalid_argument:字符串中没有可转换的有效数字字符时抛出
  • out_of_range:转换结果超出目标类型范围时抛出

完整的异常处理示例如下:

#include <iostream>
#include <string>
#include <stdexcept> // 包含异常类型定义
using namespace std;

int main() {
    string test_str1 = "abc123";
    string test_str2 = "9999999999";
    string test_str3 = "45.6";

    // 处理stoi转换
    try {
        int num1 = stoi(test_str1);
        cout << "stoi转换结果:" << num1 << endl;
    } catch (const invalid_argument& e) {
        cout << "stoi转换失败:字符串无有效数字字符" << endl;
    } catch (const out_of_range& e) {
        cout << "stoi转换失败:结果超出int范围" << endl;
    }

    // 处理stoi超范围场景
    try {
        int num2 = stoi(test_str2);
        cout << "stoi转换结果:" << num2 << endl;
    } catch (const invalid_argument& e) {
        cout << "stoi转换失败:字符串无有效数字字符" << endl;
    } catch (const out_of_range& e) {
        cout << "stoi转换失败:结果超出int范围" << endl;
    }

    // 处理stod转换
    try {
        double num3 = stod(test_str3);
        cout << "stod转换结果:" << num3 << endl;
    } catch (const invalid_argument& e) {
        cout << "stod转换失败:字符串无有效数字字符" << endl;
    } catch (const out_of_range& e) {
        cout << "stod转换失败:结果超出double范围" << endl;
    }
    return 0;
}

提升转换健壮性的补充技巧

如果希望更精准地控制转换过程,还可以使用stoistod的带参数重载版本,通过第二个参数获取转换结束的位置,判断整个字符串是否都被有效转换:

#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;

int main() {
    string str = "123abc";
    size_t pos; // 用于存储转换结束的位置
    try {
        int num = stoi(str, &pos);
        // 判断转换结束后是否到达字符串末尾,若没有说明存在无效后缀
        if (pos == str.length()) {
            cout << "完整转换结果:" << num << endl;
        } else {
            cout << "转换部分结果:" << num << ",未转换部分:" << str.substr(pos) << endl;
        }
    } catch (const exception& e) {
        cout << "转换失败:" << e.what() << endl;
    }
    return 0;
}

这种写法可以在转换部分成功时,进一步校验字符串的剩余内容,避免将"123abc"这类混合字符串误判为合法的数字输入,让字符串数字提取的逻辑更加严谨。

C++stoistod字符串提取数字异常处理修改时间:2026-07-08 15:27:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。