【C++】字符串和数值类型的相互转化(借助STL)


写在文章开头的话

读完这篇文章后,你将学到下面的知识:
(1)如何利用标准库中的 std::stringstream 来完成字符串和数值类型的相互转换
(2)如何利用 C++11 提供的字符串转换函数,将std::string类型转换为数值类型

     在C++编程中有时会遇到字符串和数字的相互转化,以前学习的时候老师喜欢将这种转化当成作业,要我们写函数实现。但是实际为了方便准确还是会优先使用STL来完成。
     在 C 标准库中提供了字符串到数值类型的转化函数,但是没有提供数值到字符串的转换(不过有些系统如 Windows API中提供数值到字符串的转化)。先看看C标准库中的字符串转化函数,这些函数都包含在头文件 <cstdlib>中:

表1  C 标准库中的字符串转换函数

这些函数的用法想必都比较熟悉就不多说了,细节可以参考 C或C++ 标准库。这里主要说下借助 C++ 标准模板库中的 std::stringstream 来完成字符串的转换, 以及 C++11新增的 std::string 转换函数。

### 将字符串中的数字提取并转换为整型 在多种编程语言中,可以通过不同的方法实现从字符串中提取数字并将它们转换为整型的操作。以下是针对 Python、Java C++ 的具体解决方案。 #### Python 实现 Python 提供了灵活的字符串处理功能以及内置函数 `int()` 来完成数据类型的转换。可以利用正则表达式模块 `re` 找到所有的数字子串,并将其逐一转换为整型[^2]。 ```python import re def extract_and_convert(s): numbers_str = re.findall(r'\d+', s) # 使用正则匹配所有连续的数字字符 numbers_int = [int(num) for num in numbers_str] # 转换为整型列表 return numbers_int # 测试代码 test_string = "abc123xyz456" result = extract_and_convert(test_string) print(result) # 输出: [123, 456] ``` #### Java 实现 在 Java 中,同样可以借助正则表达式的工具类 `Pattern` `Matcher` 完成类似的逻辑。找到所有符合条件的部分后,再调用 `Integer.parseInt(String)` 方法来执行类型转换[^1]。 ```java import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static List<Integer> extractAndConvert(String input) { Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(input); List<Integer> result = new ArrayList<>(); while (matcher.find()) { result.add(Integer.parseInt(matcher.group())); // 将匹配项转化为整数加入集合 } return result; } public static void main(String[] args) { String testString = "abc123xyz456"; System.out.println(extractAndConvert(testString)); // 输出: [123, 456] } } ``` #### C++ 实现 对于 C++ 而言,虽然它不自带像其他高级语言那样方便快捷的方法库来做这些事情,但是仍然能够依靠标准模板库 STL 下的一些组件比如 `<regex>` 或者手动遍历查找的方式达成目标。 这里给出一种基于迭代器扫描整个输入序列寻找合法数字片段的例子: ```cpp #include <iostream> #include <vector> #include <string> std::vector<int> extractAndConvert(const std::string &s){ std::vector<int> results; size_t pos = 0; while ((pos = s.find_first_of("0123456789", pos)) != std::string::npos){ int start = pos++; while(pos < s.length() && isdigit(s[pos])) ++pos; try{ results.push_back(std::stoi(s.substr(start, pos-start))); }catch(...){} // 忽略异常情况下的错误 } return results; } // 主程序入口演示效果 int main(){ const char* str="hello world! my number is 123 and also have another one which is 456."; auto res=extractAndConvert(str); for(auto i :res ) std::cout<<i<<" "; // 应该打印出 '123 456' } ``` 以上三种方式分别展示了不同环境下如何有效地解析含有混合内容的目标源码,并成功获取其中嵌入的具体数值信息作为进一步计算的基础素材。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值