在 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 >> n
成功并获得您的3
,并使流处于良好状态。由于这个良好的状态,循环随后运行第四次,直到下一个(第四次)iss >> 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 >> 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 中读取?