【C++】深入理解string相关函数:实现和分析


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯1. 使用 stoi 和 stol 函数
    • 1.1 stoi 和 stol 的基本概述
    • 参数说明
    • 进制支持
    • 示例代码与解析
      • 运行结果
      • 解析
    • 异常处理
  • 💯2. 使用 stod 和 stof 函数
    • 2.1 stod 和 stof 的基本概述
    • 参数说明
    • 示例代码与解析
      • 运行结果
      • 解析
    • 异常处理
  • 💯3. 使用 to_string 函数
    • 3.1 to_string 的基本概述
    • 特点
    • 示例代码与解析
      • 运行结果
      • 解析
  • 💯小结


在这里插入图片描述


💯前言

  • C++ 提供了强大的文本处理和数值转换功能组件,为程序员高效开发提供了便利工具,例如 std::stoi、std::stol、std::stod,以及实现反向操作的 std::to_string。这些函数在处理字符串与数值之间的转换时,表现出高度的灵活性和高效性。
    本文将全面解析 C++ 中这些 string 相关的工具函数,包括它们的原理、用法、应用场景,以及必要的拓展内容,以帮助读者更好地掌握这些函数的使用,并在实际开发中灵活运用。
    C++ 参考手册
    在这里插入图片描述

💯1. 使用 stoi 和 stol 函数

1.1 stoi 和 stol 的基本概述

在 C++ 中:

  • std::stoi 用于将字符串类型转换为 int 类型。
  • std::stol 用于将字符串类型转换为 long 类型。

它们的函数原型如下:

int stoi(const string& str, size_t* idx = 0, int base = 10);
long stol(const string& str, size_t* idx = 0, int base = 10);

参数说明

  • str:待解析的字符串。
  • idx:可选参数,用于返回解析结束的位置(字符串中第一个无法被转换的字符位置)。如果不需要返回位置,可传入 nullptr 或忽略。
  • base:表示字符串中数值部分的进制,默认为 10(十进制),也可以是 2、8、16 等。

进制支持

  1. base = 2:字符串将按二进制解析。
  2. base = 8:字符串将按八进制解析。
  3. base = 16:字符串将按十六进制解析。
  4. base = 0:自动检测进制,例如:
    • 0x0X 开头的字符串会被解析为十六进制。
    • 0 开头但不含 x 的字符串会被解析为八进制。
    • 没有前缀的字符串默认为十进制。

示例代码与解析

以下是一个具体的代码示例,展示了 stoistol 的用法:

#include <iostream>
#include <string>
using namespace std;int main() {size_t pos = 0;string s1 = "11x34";int ret1 = stoi(s1, &pos, 16); // 按 16 进制解析cout << ret1 << endl;          // 输出结果cout << "pos:" << pos << endl; // 输出解析位置string s2 = "11x34";int ret2 = stoi(s2, &pos, 2);  // 按 2 进制解析cout << ret2 << endl;          // 输出结果cout << "pos:" << pos << endl;string s3 = "0x11x34";int ret3 = stoi(s3, &pos, 0);  // 自动检测进制cout << ret3 << endl;cout << "pos:" << pos << endl;return 0;
}

运行结果

17
pos:2
3
pos:2
17
pos:4

解析

  1. 第一部分
    • 输入字符串 "11x34",按 16 进制解析,11 表示十六进制中的 17
    • 返回值 ret1 = 17pos = 2 表示解析结束时的字符串位置。
  2. 第二部分
    • 按二进制解析,11 表示二进制中的 3
    • 返回值 ret2 = 3pos = 2
  3. 第三部分
    • 自动检测进制,0x11 被解析为十六进制的 17
    • 返回值 ret3 = 17pos = 4

异常处理

  • 如果字符串中没有可以解析的数值,将抛出 std::invalid_argument 异常。
  • 如果值超出目标类型的范围,将抛出 std::out_of_range 异常。

💯2. 使用 stod 和 stof 函数

2.1 stod 和 stof 的基本概述

  • std::stod:将字符串类型转换为 double 类型。
  • std::stof:将字符串类型转换为 float 类型。

它们的函数原型如下:

double stod(const string& str, size_t* idx = 0);
float stof(const string& str, size_t* idx = 0);

参数说明

  • str:待解析的字符串。
  • idx:与 stoistol 类似,用于返回解析结束的位置。

示例代码与解析

#include <iostream>
#include <string>
using namespace std;int main() {string s = "3.14x456";double ret = stod(s, nullptr); // 转换为 double 类型cout << ret << endl;          // 输出结果return 0;
}

运行结果

3.14

解析

  • stod 从字符串开头解析 3.14,转换为 double 类型。
  • 遇到非数字字符时(如 x456),解析停止,但不会报错。

异常处理

  • 如果字符串中没有可以解析的数值,将抛出 std::invalid_argument 异常。
  • 如果值超出目标类型的范围,将抛出 std::out_of_range 异常。

💯3. 使用 to_string 函数

3.1 to_string 的基本概述

std::to_string 用于将数值类型转换为字符串。其函数原型如下:

string to_string(int val);
string to_string(long val);
string to_string(long long val);
string to_string(unsigned val);
string to_string(unsigned long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);

特点

  • 支持多种数值类型(整数、浮点数等)。
  • 返回值为标准的 string 类型,便于字符串操作。

示例代码与解析

#include <iostream>
#include <string>
using namespace std;int main() {string pi = "pi is " + to_string(3.14159); // 将浮点数转换为字符串cout << pi << endl;                        // 输出结果return 0;
}

运行结果

pi is 3.141590

解析

  • 浮点数 3.14159 被转换为字符串并拼接到 "pi is " 后。
  • 注意,输出的浮点数可能包含更多的有效数字,因为它保留了内部存储的精度。

💯小结

通过本次学习,我们全面解析了 C++ 中与字符串相关的数值转换函数,包括 stoistolstodstofto_string 的基本用法、特性以及实际代码示例。这些函数在实际开发中用途广泛,尤其在处理用户输入、文件解析和格式化输出时极为有用。

建议读者在实践中多尝试不同参数的组合,以及结合异常处理机制,确保程序的健壮性。如果对本文内容还有疑问或希望更深入了解某些特定函数,欢迎继续交流探讨!


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

相关文章

“AI智能服务平台系统,让生活更便捷、更智能

大家好&#xff0c;我是资深产品经理老王&#xff0c;今天咱们来聊聊一个让生活变得越来越方便的高科技产品——AI智能服务平台系统。这个系统可是现代服务业的一颗璀璨明珠&#xff0c;它究竟有哪些魅力呢&#xff1f;下面我就跟大家伙儿闲聊一下。 一、什么是AI智能服务平台系…

回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测

回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测 目录 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测。 程序设计 完整代码&#xff1a;回…

页面滚动下拉时,元素变为fixed浮动,上拉到顶部时恢复原状,js代码以视频示例

页面滚动下拉时,元素变为fixed浮动js代码 以视频示例 <style>video{width:100%;height:auto}.div2,#float1{position:fixed;_position:absolute;top:45px;right:0; z-index:250;}button{float:right;display:block;margin:5px} </style><section id"abou…

【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)

文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起&#xff0c;正向定位到当前行的首个字符 b2 从光标位置起&#xff0c;反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…

力扣 岛屿数量

从某个点找&#xff0c;不断找相邻位置。 题目 岛屿中被“0”隔开后 &#xff0c;是每一小块状的“1”&#xff0c;本题在问有多少块。可以用dfs进行搜索&#xff0c;遍历每一个点&#xff0c;把每一个点的上下左右做搜索检测&#xff0c;当检测到就标记为“0”表示已访问过&a…

Python学习(四)调用函数、定义函数、函数参数、递归函数

目录 一、调用函数1&#xff09;函数介绍2&#xff09;数据类型转换 二、定义函数1&#xff09;定义函数2&#xff09;空函数3&#xff09;参数检查4&#xff09;返回多个值 三、函数的参数1&#xff09;位置参数2&#xff09;默认参数3&#xff09;可变参数4&#xff09;关键字…

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2)

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2) 下面我们继续来介绍AutoSAR CP分层架构&#xff0c;下面的文字和图来自AutoSAR官网目前最新的标准R24-11的分层架构手册。该手册详细讲解了AutoSAR分层架构的设计&#xff0c;下面让我们来一起学习一下。 Introductio…

Mac——Docker desktop安装与使用教程

摘要 本文是一篇关于Mac系统下Docker Desktop安装与使用教程的博文。首先介绍连接WiFi网络&#xff0c;然后详细阐述了如何在Mac上安装Docker&#xff0c;包括下载地址以及不同芯片版本的选择。接着讲解了如何下载基础镜像和指定版本镜像&#xff0c;旨在帮助用户在Mac上高效使…

Jenkins内修改allure报告名称

背景&#xff1a; 最近使用Jenkins搭建自动化测试环境时&#xff0c;使用Jenkins的allure插件生成的报告&#xff0c;一直显示默认ALLURE REPORT&#xff0c;想自定义成与项目关联的名称&#xff0c;如图所示&#xff0c;很明显自定义名称显得高大上些&#xff0c;之前…

ROS Action接口

实现自主导航是使用Action接口的主要目的 在实际使用navigation导航系统的时候&#xff0c;机器人需要自主进行导航。不能每次都手动设置导航的目标点。所以需要编写程序代码来实现导航控制。这就需要使用到navigation的导航接口。Navigation的这个导航接口有好几个。Rose官方…

【复习小结】1-13

数学追求更简洁的表达&#xff0c;计算机追求更简单的表达。数据结构把数学的逻辑结构放进计算器的存储器。 DAY4 闰年的计算 布尔类型是一种数据类型&#xff0c;用于表示逻辑值的简单类型&#xff0c;它的值只能是真&#xff08;true&#xff09;或假&#xff08;false&…

docker安装windows desktop后打开失败

解决&#xff1a;运行以下命令在windows上安装linux环境&#xff0c;然后设置用户名密码即可 wsl --install

H2数据库在单元测试中的应用

H2数据库特征 用比较简洁的话来介绍h2数据库&#xff0c;就是一款轻量级的内存数据库&#xff0c;支持标准的SQL语法和JDBC API&#xff0c;工业领域中&#xff0c;一般会使用h2来进行单元测试。 这里贴一下h2数据库的主要特征 Very fast database engineOpen sourceWritten…

计算机网络 (33)传输控制协议TCP概述

一、定义与基本概念 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它工作在OSI模型的第四层&#xff0c;即传输层&#xff0c;为用户提供可靠的、有序的和无差错的数据传输服务。TCP协议与UDP协议是传输层的两大主要协议&#xff0c;但两者在设计上有明显的不同&…

转运机器人在物流仓储行业的优势特点

在智能制造与智慧物流的浪潮中&#xff0c;一款革命性的产品正悄然改变着行业的面貌——富唯智能转运机器人&#xff0c;它以卓越的智能科技与创新的设计理念&#xff0c;引领着物流领域步入一个全新的高效、智能、无人的时代。 一、解放双手&#xff0c;重塑物流生态 富唯智能…

【论文阅读+复现】High-fidelity Person-centric Subject-to-Image Synthesis

以人物为中心的主体到图像的高保真合成&#xff0c;CVPR2024 code&#xff1a;CodeGoat24/Face-diffuser: [CVPR2024] Official implementation of High-fidelity Person-centric Subject-to-Image Synthesis. paper&#xff1a;2311.10329 背景 研究问题&#xff1a;这篇文…

做一个 简单的Django 《股票自选助手》显示 用akshare 库(A股数据获取)

图&#xff1a; 股票自选助手 这是一个基于 Django 开发的 A 股自选股票信息查看系统。系统使用 akshare 库获取实时股票数据&#xff0c;支持添加、删除和更新股票信息。 功能特点 支持添加自选股票实时显示股票价格和涨跌幅一键更新所有股票数据支持删除不需要的股票使用中…

USB学习——基本概念

文章目录 USB&#xff08;Universal Serial Bus&#xff09;概述USB系统的描述USB总线传输方式USB的拓扑结构 USB的连接模型USB控制器及分类USB描述符USB 端点USB枚举过程USB 四种传输类型USB 事务批量传输(Bulk)中断传输(Interrupt)等时传输(Isochronous)控制传输(Control)端点…

通信与网络安全之网络连接

一.传输介质类型 1.基本概念 计算机总是以二进制的数字&#xff08;0或1&#xff09;形式工作 1&#xff09;数字和模拟 模拟数据一般采用模拟信号(Analog Signal)&#xff0c;例如用一系列连续变化的电磁波(如无线电与电视广播中的电磁波)&#xff0c;或电压信号(如电话传…

ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders论文解读

论文地址&#xff1a;https://arxiv.org/abs/2301.00808 论文相对ConvNeXt V1的改进主要两点 全卷积掩码自编码器&#xff08;FCMAE&#xff09;Global Response Normalization&#xff0c;去除Layer scale 什么是layer scale 实验 先用FCMAE预训练&#xff0c;然后微调