Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++篇】像解谜一样转换字符串:stoi 带你走向整数的世界

【C++篇】像解谜一样转换字符串:stoi 带你走向整数的世界

作者头像
熬夜学编程的小王
发布于 2024-11-25 06:28:31
发布于 2024-11-25 06:28:31
85205
代码可运行
举报
文章被收录于专栏:编程小王编程小王
运行总次数:5
代码可运行

前言

在现代 C++ 编程中,字符串与数字之间的转换是非常常见的需求。随着编程语言的发展,C++ 提供了多种方式来处理这种转换。stoi(string to integer)函数正是为了简化这一任务而被引入的。 在 C++ 的早期版本中,字符串转换为整数通常通过 C 风格的函数(如 atoi)来完成。然而,这些方法存在一些问题,比如:

  • 错误处理不足atoi 在遇到无效输入时不会抛出异常,导致程序行为不可预测。
  • 功能受限:C 风格的函数只能处理简单的转换,无法处理更复杂的需求,比如进制转换或精确的错误定位。

stoi 是 C++11 引入的一个标准库函数,常用于将字符串转换为整数。它的全称是 "string to integer"。

 1 背景与应用场景

1.1 stoi 的引入背景

C++11 标准引入了 stoi 等新的字符串转换函数,目的就是填补 C 风格函数的不足,提供更为安全、灵活和强大的字符串转换功能。stoi 属于标准库的一部分,可以通过 <string> 头文件引入。它不仅可以将字符串转换为整数,还可以通过额外的参数指定进制,并在解析过程中精确定位错误的位置。

与 C 风格的函数不同,stoi 具有以下优点:

  • 异常处理:遇到无效输入时,会抛出异常,方便程序进行错误处理。
  • 灵活性:支持指定进制(如二进制、十六进制等),提供了更广泛的应用场景。
  • 定位解析位置:通过 pos 参数,能够指出字符串转换失败的位置,增强了调试能力。
1.2 stoi 的优势
  1. 易于使用stoi 接口简洁明了,适合大部分转换需求。
  2. 异常机制:通过 std::invalid_argumentstd::out_of_range 异常,可以更优雅地处理错误情况。
  3. 支持进制转换:支持 2 至 36 的进制转换,方便处理不同的数字表示。
  4. 优化性能:相对于早期的字符串解析方法,stoi 在处理现代应用时更为高效和安全
1.3 应用场景
  • 用户输入处理:通常需要将用户输入的字符串转换为整数。
  • 文件解析:在读取文件时,可能会遇到包含数字的字符串,需要将其转换为数值。
  • 网络协议解析:一些网络协议传输的数据是以字符串的形式编码,解析时需要将其转换为数字。

 总的来说,stoi 函数的引入,是为了使 C++ 更加现代化和灵活,同时解决了早期字符串转换函数在错误处理和功能扩展方面的不足。它不仅提供了更安全的错误处理机制,还使得字符串到整数的转换变得更为高效和精确。

2. stoi函数详细剖析 

 函数原型

int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);

参数说明

str:待转换的字符串,必须是可解析为整数的形式,否则会抛出异常。

pos(可选): 一个指针,用于存储解析结束后字符串的下一个位置索引。 如果你不需要这个功能,可以将其设置为默认值 0nullptr

base(可选):要转的字符串的进制数 整数的进制,默认为 10(十进制)。可以指定其他基数,如 216 等。

返回值

  • 转换后的整数。

异常

  1. std::invalid_argument: 当字符串不能被转换为有效整数时抛出,如 "abc"
  2. std::out_of_range: 当字符串表示的值超出整数的范围时抛出,如 "99999999999999999999"(超出 int 的表示范围)。
2.1 基本用法

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <string>

using namespace std;
int main() 
{
    string str = "123";
    int num = stoi(str);
    std::cout << "整数值: " << num << std::endl;  // 输出: 整数值: 123
    return 0;
}
2.2 使用pos

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "123abc";
    size_t pos;
    int num = stoi(str, &pos);
    cout << "整数值: " << num << endl;  // 输出: 整数值: 123
    cout << "未解析部分索引: " << pos << endl;  // 输出: 未解析部分索引: 3
    return 0;
}

解析:

size_t pos;

声明一个变量 pos,类型为 size_t(无符号整数),用于存储 stoi 函数解析结束后的位置索引

     int num = stoi(str, &pos);

  • 调用 stoi 函数,将字符串 str 中可解析的整数部分转换为 int 类型,并赋值给变量 num
  • 解析细节:
    1. 从字符串 str 的左侧开始,解析数字部分 "123"
    2. 将解析出的数字部分转换为整数 123 并返回。
    3. &pos 保存解析结束的位置索引,即数字部分之后的字符索引(这里是索引 3,因为 str[3]a)。

关键点扩展

  1. stoi 的行为
    • 从左向右解析字符串中可转换为整数的部分。
    • 遇到第一个非数字字符时停止解析。
    • 返回解析出的整数,并通过 pos 指针告诉解析结束的位置。
  2. pos 的意义
    • pos 保存的是从字符串开头到解析结束的字符数。例如,"123abc" 中,解析到索引 3 停止。
  3. 未解析部分
    • 如果 pos 不等于字符串长度 str.size(),说明字符串中存在未被解析的部分。
    • 在本例中,未解析部分是 "abc",位于索引 3 及之后。
  4. 错误处理(异常)
    • 如果字符串中没有可解析的整数部分(如 "abc"),stoi 会抛出 std::invalid_argument 异常。
    • 如果字符串表示的数字超出 int 的范围,stoi 会抛出 std::out_of_range 异常。
2.3 不同进制转换
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str_hex = "1A";  // 十六进制
    int num = stoi(str_hex, nullptr, 16);
    cout << "十六进制转换为整数: " << num << endl;  // 输出: 十六进制转换为整数: 26

    string str_bin = "1101";  // 二进制
    num = stoi(str_bin, nullptr, 2);
   cout << "二进制转换为整数: " << num << endl;  // 输出: 二进制转换为整数: 13

    return 0;
}
2.4 异常处理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "123abc";
    size_t pos;

    try {
        int num = stoi(str, &pos);
        cout << "整数值: " << num << endl;
        cout << "未解析部分索引: " << pos << endl;
    } catch (const invalid_argument& e) {
        cout << "无效输入,无法解析整数。" << endl;
    } catch (const out_of_range& e) {
        cout << "输入数字超出范围。" << endl;
    }

    return 0;
}

扩展知识

2.5 注意事项

。stoi 是对 strtol 函数的一个封装,提供更现代化的接口

。如果需要处理大数,可以使用类似的函数 stoll,返回 long long 类型

。对于非整数类型的转换,可以使用 stof(float)、stod(double)等函数

 3. 常见问题与解决

3.1 如何处理输入中包含前导空格?

stoi 会自动忽略字符串前导空格,因此不需要额外处理。

示例:

std::string str = "   42"; int num = std::stoi(str); std::cout << num;  // 输出: 42

 3.2 如何确定字符串完全被解析为整数?

可以结合 pos 参数,检查解析是否到字符串末尾:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <string>
using namespace std;

int main() 
{
    string str = "42abc";
    size_t pos;
    int num = stoi(str, &pos);
    if (pos != str.size()) 
    {
        cout << "字符串未完全解析,剩余部分: " << str.substr(pos) << endl;   //输出abc
    }

    return 0;
}
相关函数
  • stol / stoll:将字符串转换为 longlong long
  • stof / stod / stold:将字符串转换为浮点数。
  • to_string:整数转换为字符串。

 最后:将文字转化为力量

通过本文对 C++ 中 stoi 函数的详细讲解,我们可以看到它在字符串到整数转换中扮演的重要角色。从简单的整数提取到支持多进制解析,再到异常处理机制的保障,stoi 函数为程序开发提供了高效且安全的解决方案。

无论是在用户输入处理、文件解析,还是网络协议中的数据转换中,stoi 的灵活性和安全性都使其成为开发者不可或缺的工具。我们不仅掌握了它的基本用法,还了解了其参数细节、异常处理和一些典型应用场景。

最后,编程就像搭建一座桥梁,而 stoi 则是将字符串的虚拟世界连接到数值的真实世界的一块基石。在开发过程中,只要掌握它的特性并加以灵活运用,就能让你的代码更加稳健、优雅,真正实现从文字到数字的高效转化。

你的编程之旅,不止于此,期待你在更多场景中发现 stoi 的潜力!

 编程道路会经历很多困难,会想过放弃,但我想说的是事情其实没有那么难,咬咬牙就坚持过去了,最后送大家一句话  "路虽远,行则将至;事虽难,做则必成"  与诸君共勉。

下一篇文章再会!!! 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++17 中的 std::to_chars 和 std::from_chars:高效且安全的字符串转换工具
在现代 C++ 开发中,字符串与数值之间的转换是一个常见的需求,尤其是在处理输入输出、数据解析和格式化时。C++17 引入了 std::to_chars 和 std::from_chars,这两个函数为开发者提供了高效、安全且灵活的字符串转换工具。
码事漫谈
2025/02/20
2742
C++17 中的 std::to_chars 和 std::from_chars:高效且安全的字符串转换工具
C++之split字符串分割
函数原型:char * strtok (char *str, char * delim);
全栈程序员站长
2022/08/13
6.2K0
C++之split字符串分割
C++一分钟之-字符串处理:std::string
在C++编程中,std::string 是处理文本数据不可或缺的工具。它属于标准库 <string> 中的一部分,提供了丰富的功能来简化字符串的操作。本文将深入浅出地介绍 std::string 的基本用法、常见问题、易错点及避免策略,并附上实用的代码示例。
Jimaks
2024/06/25
8900
C/C++数字与字符串互相转换
在C/C++程序中,会需要把数字与字符串做出互相转换的操作,用于实现程序想要的效果。下面将介绍多种方法实现数字与字符串互相转换。
摆烂小白敲代码
2024/09/23
3230
C/C++数字与字符串互相转换
【C++奇迹之旅】:字符串转换成数字&&将数字转换成字符串&&大全
在 C++ 里,把字符串转换成数字有多种方式,下面针对不同的数据类型和使用场景详细介绍具体
学习起来吧
2025/03/02
3001
【C语言篇】从字符海洋到整数大陆——atoi 的探险之旅
在编程世界中,数据的存储和展示往往以字符串形式存在,例如从用户输入、文件读取或网络传输中获取的数据。为了对这些数据进行数值计算,我们需要一种可靠的方法将字符串转换为整数。这正是 atoi(ASCII to Integer)函数的用武之地。
熬夜学编程的小王
2024/11/25
2270
【C++经典例题】字符串转整数(atoi)的实现与解析
在编程中,经常会遇到将字符串转换为整数的需求,就像标准库中的 atoi 函数一样。
倔强的石头_
2025/05/15
1380
【C++经典例题】字符串转整数(atoi)的实现与解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
C++ 标准库中的 string 类是操作字符串的强大工具。与传统的 C 风格字符串(char[])相比,string 不仅支持自动内存管理,还提供了多种简洁而强大的接口。本文将带你详细了解 string 的常见用法、构造方法、容量操作、访问与修改等操作,帮助你从容应对实际开发中涉及字符串操作的场景。
半截诗
2024/10/09
4150
C/C++语言字符串操作总结大全(超详细)
strpbrk(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素
用户7886150
2021/02/08
9500
C++ 11字符数组/字符串/数字转换/字符串拼接
缺点:处理大量数据转换速度较慢。stringstream不会主动释放内存,如果要在程序中用同一个流,需要适时地清除一下缓存,用stream.clear()
SL_World
2021/09/18
3.4K0
C++字符串处理小结
常用的C++的字符串类型主要是std::string。它是模板std::basic_string的一个实例化。另外还有三个实例化std::wstring、std::u16string、std::u32string,不过不是很常用。
linjinhe
2018/06/06
3.1K3
任意进制转换:C++实现与优化
在编程中,进制转换是一个非常常见的操作。我们常常需要将一个数从一种进制转换为另一种进制。例如,二进制、十进制、十六进制等不同进制的数值广泛应用于计算机科学、数学以及编程中。掌握进制转换的技巧,不仅能帮助我们理解不同数值表示的方式,还能在多种算法中提高效率。
平凡之路.
2025/02/08
2520
任意进制转换:C++实现与优化
华为机试 HJ33 整数与IP地址间的转换
我一开始想到的思路是针对10.0.3.193这种点分十进制的IP地址,将其转换成字符串,然后按照字符.进行分割,放入数组中,然后对数组中的4个数字进行位运算,最后进行组合。而对于167969729这种长整型的IP地址,进行位运算后依次得到点分十进制中的每一项,以8位进行右移运算。具体的代码如下:
ccf19881030
2023/02/26
1K0
华为机试 HJ33 整数与IP地址间的转换
C++ 中的 `string` 类型:全面解析与高效操作
在 C++ 中,string 类型是对字符数组的高级封装,它提供了大量内置函数,使得字符串的处理变得更为简便和高效。与 C 风格的字符数组不同,string 类型不仅自动管理内存,还提供了更丰富的操作方法。本文将通过详细讲解 string 类型的概念、常见操作及相关函数,帮助你快速掌握这一强大工具。
平凡之路.
2025/02/06
3180
C++ 中的 `string` 类型:全面解析与高效操作
杨校老师课堂之基于C++的sort排序与字符串解题_信息学奥赛-基础练习题
题目描述 陈平安参加了Coduck王国举办的记忆之王比赛,比赛规则是给出一篇文章,让所有选手以最快的速度进行记忆,记忆时间最短的三名选手依次获得记忆之王、记忆强者、记忆达人的称号,本次比赛一共有n名选手参赛,请根据他们的的记忆时间,选出其中最短的三个时间按从小到大的顺序输出。
杨校
2025/02/23
910
【C++篇】探索STL之美:熟悉使用String类
C++ 标准库中的 std::string 类是一个非常强大的工具,用于处理和操作字符串。它属于 <string> 头文件,并提供了一套丰富的功能和方法。以下是 std::string 类的一些主要特性和常用操作:
熬夜学编程的小王
2024/11/20
900
【C++篇】探索STL之美:熟悉使用String类
C++ Boost库 操作字符串与正则
字符串的查找与替换一直是C++的若是,运用Boost这个准标准库,将可以很好的弥补C++的不足,使针对字符串的操作更加容易。
王 瑞
2022/12/28
1.1K0
【C++】STL 容器 - string 字符串操作 ③ ( string 字符串 与 char* 字符串转换 | string#c_str() 成员函数 | string#copy() 成员函数 )
在 C++ 语言中的 std::string 类中 , 封装了一个 c_str() 成员函数 , 用于返回一个指向字符串内容的常量字符指针 ;
韩曙亮
2023/12/18
2.6K0
【C++】STL 容器 - string 字符串操作 ③ ( string 字符串 与 char* 字符串转换 | string#c_str() 成员函数 | string#copy() 成员函数 )
c++字符串与c字符串
1. C风格的字符串2. 字符串字面量3.C++ std::string 类3.1 C风格字符串的优势和劣势3.2 使用string类3.2.1 std::string 字面量3.2.2 c++字符串的数值转换(1)字符串转数值(2)数值转字符串
用户7886150
2021/02/05
1.7K0
C语言和C++中的字符串(string)
C语言字符串是字符的数组。单字节字符串顺序存放各个字符串,并用'\0'来表示字符串结束。在C语言库函数中,有一系列针对字符串的处理函数,比如说strcpy()、sprintf()、stoi()等,只能用于单字节字符串,当然也有一些函数用于处理Unicode字符串,比如wcscpy()、swprintf()等
用户7886150
2021/02/16
3.2K0
推荐阅读
相关推荐
C++17 中的 std::to_chars 和 std::from_chars:高效且安全的字符串转换工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验