【C++】atoi和std::stoi

两个将字符串转为int的方法

atoi(C语言)

atoi 是 C 库中的一个函数,它定义在 <cstdlib> 头文件里。其作用是把一个字符串转换为对应的整数。

/* Convert a string to an integer.  */
extern int atoi (const char *__nptr)__THROW __attribute_pure__ __nonnull ((1)) __wur;

转换的原则如下:
此函数接收一个以空字符 '\0' 结尾的字符串 str 作为参数,然后尝试把该字符串转换为一个 int 类型的整数。

  1. 该函数会跳过字符串开头的空白字符(像空格、制表符、换行符等)。
  2. 接着,它会识别一个可选的正负号(+ 或者 -)。
  3. 随后,它会尽可能多地读取数字字符,直到遇到非数字字符或者字符串结束符 ‘\0’。
  4. 最后,它会把读取到的数字字符转换为整数并返回。要是字符串里没有有效的数字,或者字符串仅包含空白字符,函数会返回 0。

下面是示例代码:

    const char* str1 = "123";const char* str2 = "   -456";const char* str3 = "abc123";const char* str4 = "  789abc";int num1 = atoi(str1);int num2 = atoi(str2);int num3 = atoi(str3);int num4 = atoi(str4);std::cout << "str1 转换结果: " << num1 << std::endl;std::cout << "str2 转换结果: " << num2 << std::endl;std::cout << "str3 转换结果: " << num3 << std::endl;std::cout << "str4 转换结果: " << num4 << std::endl;

转换结果如下:

str1 转换结果: 123
str2 转换结果: -456
str3 转换结果: 0
str4 转换结果: 789

对于 str1,它是一个纯粹的数字字符串 “123”,所以 atoi 会把它转换为整数 123。
对于 str2,字符串开头有空白字符,随后是负号和数字,atoi 会忽略空白字符,识别负号,然后把数字转换为 -456。
对于 str3,字符串开头没有数字,所以 atoi 会返回 0。
对于 str4,字符串开头有空白字符,接着是数字,atoi 会忽略空白字符,把数字 789 转换为整数并返回。

atoi的设计有很浓的C语言设计风格,你甚至不知道返回0是因为失败了还是因为原来的字符串本身就是0.

std::stoi

std::stoi 是 C++ 标准库 <string> 中的函数。除了名字不同以外,两个函数有以下不同点:

atoistd::stoi
位置<stdlib.h><cstdlib><string>
函数原型extern int atoi (const char *__nptr)inline int stoi(const string& __str, size_t* __idx = 0, int __base = 10)
失败返回0抛出异常

依然是上面的例子:

    const std::string str1 = "123";const std::string str2 = "   -456";const std::string str3 = "abc123";const std::string str4 = "  789abc";try{int n1 = std::stoi(str1);std::cout << "new str1 转换结果: " << n1 << std::endl;}catch (std::exception &e){std::cout << "new str1 转换结果: " << e.what() << std::endl;}try{int n1 = std::stoi(str2);std::cout << "new str2 转换结果: " << n1 << std::endl;}catch (std::exception &e){std::cout << "new str2 转换结果: " << e.what() << std::endl;}try{int n1 = std::stoi(str3);std::cout << "new str3 转换结果: " << n1 << std::endl;}catch (std::exception &e){std::cout << "new str3 转换结果: " << e.what() << std::endl;}try{int n1 = std::stoi(str4);std::cout << "new str4 转换结果: " << n1 << std::endl;}catch (std::exception &e){std::cout << "new str4 转换结果: " << e.what() << std::endl;}

第三个因为开头是非数字字符,转换失败抛异常:

new str1 转换结果: 123
new str2 转换结果: -456
new str3 转换结果: stoi
new str4 转换结果: 789

__idx参数的设计也很有C语言的风格,它存储了第一个未被转换的字符的位置。

    try{size_t end;int n1 = std::stoi(str4, &end);std::cout << "new str4 转换结果: " << n1 << " End pos: " << end << std::endl;}catch (std::exception &e){std::cout << "new str4 转换结果: " << e.what() << std::endl;}

第五个字符就不是数字了,就停在这里。

new str4 转换结果: 789 End pos: 5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/910689.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Re:从零开始的文件结构(融合线性表来理解 考研向)

文件管理 & 线性表 文件管理文件的结构无结构文件 有结构文件&#xff08;重点&#xff09;定长与不定长记录顺序文件&#xff08;类线性表&#xff09;它的逻辑结构它的物理结构&#xff08;存储结构&#xff09;小结 索引顺序文件与多级索引顺序文件形象化理解&#xff0…

Vue2 引入 Tailwind CSS 完整指南

目录 概述 安装步骤 1. 安装 Tailwind CSS 及相关依赖 2. 初始化 Tailwind CSS 配置 3. 配置 Tailwind CSS 重要说明&#xff1a; 4. 创建 PostCSS 配置 5. 在 CSS 中引入 Tailwind 6. 在 main.js 中引入 CSS 文件 使用说明 基础类使用 布局类 间距类 颜色类 字体类 边…

关于css的height:100%

这个问题&#xff0c;今天还搞了我两个小时&#xff0c;也是基础没搞好&#xff0c;再回顾了一下 问题描述&#xff1a;客户提出&#xff0c;在弹窗的时候就没办法滚动页面了&#xff0c;客户希望还可以滚动父页面。 基于这个问题&#xff0c;我想&#xff0c;本来就是可以滚…

华为云鸿蒙应用入门级开发者认证 实验(HCCDA-HarmonyOS Cloud Apps)

HCCDA实验 实验一 任务1 补全数据模型数组项 得分点&#xff1a;能正确对指定类中创建对象进行构造初始化。 请使用如下配置自行创建API为12的应用工程&#xff1a; 应用工程创建时的相关配置如下表&#xff1a; Project name : ArkTSExam Device Type: Phone 创建成功后…

ubuntu20.04如何给appImage创建快捷方式

ubuntu20.04如何给appImage创建快捷方式 1. 确保AppImage是可执行的 chmod x /path/to/your/appimage2. 创建.desktop文件 在~/.local/share/applications/目录下创建一个新的 .desktop 文件&#xff1a; vi ~/.local/share/applications/your-appname.desktop添加以下内容…

Nordic nRF52832 寄存器级 UARTE 发送实现

目录 概述 1 nRF52832的UART寄存器 1.1 寄存器列表 1.2 寄存器介绍 1.2.1 使能控制 (ENABLE) 1.2.2 波特率设置 (BAUDRATE) 1.2.3 配置寄存器 (CONFIG) 1.2.4 引脚配置寄存器 1.2.5 数据传输寄存器 1.2.6 状态与事件寄存器 1.2.6.1 事件寄存器 (EVENTS) 1.2.6.2 错…

4.9. 环境和分布偏移

目录 4.9. 环境和分布偏移1&#xff09;分布偏移的类型 4.9. 环境和分布偏移 机器学习应用常被忽视数据来源和模型输出处理。许多模型在测试集上表现好&#xff0c;但数据分布改变时会部署失败&#xff0c;甚至模型决策本身可能破坏数据分布&#xff08;如贷款模型基于“穿牛津…

【Linux】软硬链接

目录 一、认识一下常用指令 1、建立一个软链接 2、建立一个硬链接 3、删除文件的第二种方式&#xff1a;删除链接unlink指令 二、什么是硬链接&#xff1f; 三、软硬链接的原理&#xff1a; 四、应用场景 1、建立一个软链接可以快速在一个比较深的路径中找到目标文件进行…