使用sstream读取字符串中的数字(c++)

本文介绍了C++中处理整行数字输入的两种常见方法:使用标准库函数如stoi和atoi,以及利用stringstream类进行更为灵活的转换。通过实例展示了如何使用这些方法,并对比了它们之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人博客中有本文原文https://whatghost.github.io/2020/03/06/sstream/
如果喜欢可以访问个人博客WhatGhost.github.io,会有更多分享内容

 

先介绍以前常用的方法(stoi或atoi)

在以往的c++编程中当我们输入整行以空格作为分割的数字时

由于整行读入的字符串,我们会采用空格切分字符串,在进行处理

stoi需要包含头文件#include<string>

atoi需要包含头文件#include<sctdlib>

stoi(string)参数是一string类型,当字符串不合法时,会报错

atoi(char*)参数是char*类型,即c字符串,当字符串非法时,他会从字符串开始寻找正负号小数点或者数字,遇到非法字符时停下

例如“123HD23330”通过调用atoi返回值为123,而stoi则会直接报错

此外还有一函数strtoi(char*)用法与atoi一直,只是stroi可以指定的进制

以上是整数类型的转换,此外还有stof(),stod(),strtod()等函数可以进行浮点数的转换

 

接下来是要介绍的stringstream类,运用此方法不需要将一群数字组成的串用空格切分为单个的串,在一个一个转换,而是可以直接对整个串进行转换

需要#include<sstream>

通过stringstream类对象实现字符串转

实例如下

#include<sstream>
#include<string>
#include<iostream>
using namespace std;
int main(){
    string line;
    while(getline(cin,line)){
        int x;
        stringstream ss(line);  //建立stringstream对象,初始化流内容为line所代表的字符串
        while(ss>>x)            //从line中一次读取数字存入x
        cout<<x<<endl;
    }
    return 0;
}

 

如果输为:"12 23 43 555"

则输出为 
12
23
43
555

 

 

### C++ 中字符串转换为数字的方法 #### 使用 `stoi` 函数族 C++11 引入了标准库中的 `stoi` 函数族来处理字符串到整型的转换。这些函数能够方便地将不同类型的字符串转换成对应的数值类型。 ```cpp #include <string> int main() { std::string s = "123"; int i = std::stoi(s); } ``` 此代码片段展示了如何利用 `std::stoi()` 将字符串 `"123"` 转换成了整数 `123`[^1]。 对于浮点数,则可采用类似的 `stof`, `stod`, 或者 `stold` 方法: ```cpp double d = std::stod("123.45"); ``` 这行代码实现了从字符串 `"123.45"` 到双精度浮点数 `d` 的转变。 #### sscanf 方法 另一种方式是从 C 风格继承而来的 `sscanf` 函数,它可以从给定格式说明符读取输入并解析相应的数据项。 ```cpp char* pStr = "123"; int num; sscanf(pStr, "%d", &num); ``` 上述例子通过指定 `%d` 来指示期望提取的是一个十进制整数,并将其存储于变量 `num` 中[^2]。 #### stringstream 类 除了以上两种直接的方式外,还可以借助 `<sstream>` 头文件所提供的流类对象来进行更灵活的数据转换操作。 ```cpp #include <sstream> std::stringstream ss; ss << "123"; // 向流中写入字符串形式的数字 int value; ss >> value; // 从流中读取出实际的整数值 ``` 这段代码先创建了一个 `stringstream` 对象并将目标字符串加载进去;之后再从中抽取所需的目标类型值[^3]。 #### atoi/strtol/atol 系列函数 传统上,在较早版本的标准里也存在一些简单的工具函数如 `atoi`, `atol`, 和 `strtol` 可供选择。其中最常用的就是 `strtol`,因为它允许自定义基数以及提供错误检测机制。 ```cpp const char *pString = "-123abc"; char *endptr; long lValue; lValue = strtol(pString, &endptr, 10); if (*pString == '\0' || *endptr != '\0') { printf("Invalid input\n"); } else { printf("%ld\n", lValue); } ``` 这里使用了 `strtol` 把带有负号前缀的字符串成功转化为长整形数值的同时还进行了基本的有效性验证[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值