在 C++ 中使用 istringstream 将字符串拆分为整数

Posted

技术标签:

【中文标题】在 C++ 中使用 istringstream 将字符串拆分为整数【英文标题】:Splitting a string into integers using istringstream in C++ 【发布时间】:2011-03-02 14:16:40 【问题描述】:

我正在尝试使用istringstream 将一个简单的字符串拆分为一系列整数:

#include <string>
#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main()

    string s = "1 2 3"; 
    istringstream iss(s);   

    while (iss)
    
        int n;
        iss >> n;
        cout << "* " << n << endl;
     

我得到:

* 1
* 2
* 3
* 3

为什么最后一个元素总是出现两次?如何解决?

【问题讨论】:

【参考方案1】:

它出现了两次,因为您的循环错误,正如在 http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.5 处(间接)解释的那样(在这种情况下,while (iss)while (iss.eof()) 没有什么不同)。

具体来说,在第三次循环迭代中,iss &gt;&gt; n 成功并获得您的3,并使流处于良好状态。由于这个良好的状态,循环随后运行第四次,直到下一个(第四次)iss &gt;&gt; n 随后失败,循环条件才被打破。但在第四次迭代结束之前,您仍然会输出 n... 第四次。

试试:

#include <string>
#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main()

    string s = "1 2 3"; 
    istringstream iss(s);   
    int n;

    while (iss >> n) 
        cout << "* " << n << endl;
     

【讨论】:

我们如何在 for() 循环中做到这一点? @SumitKandoi:你什么意思?你为什么要这样做? 实际上,我在 while() 循环中尝试过。我在想我们也可以在 for() 循环中这样做 @SumitKandoi:当然。但为什么? for (int n; iss &gt;&gt; n; ) ... 【参考方案2】:

希望这会有所帮助: iss : 1 2 3迭代 1 iss : 1 2 3 (最初) n=1 问题:2 3 //* 1 被打印迭代 2: iss : 2 3 (最初) n=2 问题:3 //* 2 被打印迭代 3 问题:3 n=3 iss : ''迭代 4 问题:'' n 未更改//为 iss 的 eof 设置标志,因为没有来自流的进一步输入 问题:''

正如上面的帖子正确提到的那样,while (iss) 与 while (iss.eof()) 没有什么不同。 在内部,函数(istream::operator>>) 通过首先构造一个sentry 对象来访问输入序列(noskipws 设置为false[这意味着空格是分隔符,您的列表将是1,2,3])。然后(如果good[这里没有达到eof]),它调用num_get::get[获取下一个整数]来执行提取和解析操作,相应地调整流的内部状态标志。最后,它在返回之前销毁哨兵对象。

参考:http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

【讨论】:

以上是关于在 C++ 中使用 istringstream 将字符串拆分为整数的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 istringstream 进行字符串到双重转换的意外结果

c++中istringstream及ostringstream超详细说明

C++ 中的流类型,如何从 IstringStream 中读取?

C++中的 istringstream 的用法

C++ ifstreamostringstream istringstream 读取并输出文件中的string

C++ ifstreamostringstream istringstream 读取并输出文件中的string