This question already has an answer here:
How to clear stringstream? [duplicate]
(1个答案)
5年前关闭。
我正在使用sstream解析字符串。该字符串包含任意数量的由空格分隔的整数。但是sstream无法正确解析输入。这是我的代码-
这是测试用例:Code
除了,也许还有更多的错误检查。 (
因为有人将
(1个答案)
5年前关闭。
我正在使用sstream解析字符串。该字符串包含任意数量的由空格分隔的整数。但是sstream无法正确解析输入。这是我的代码-
#include<cstdio>
#include<cstring>
#include<vector>
#include<cstdlib>
#include<sstream>
#include<iostream>
using namespace std;
vector<int> val[10010];
int main(){
int n,i,j,temp;
stringstream stream;
string s;
scanf("%d",&n);
vector<int>::iterator it;
for(i=0; i<n; i++){
getline(cin,s);
stream.str(s);
while(1) {
stream >> temp;
val[i].push_back(temp);
if(!stream)
break;
}
for(it=val[i].begin(); it!=val[i].end(); it++)
printf("%d ",*it);
printf("\n");
}
return 0;
}
这是测试用例:Code
最佳答案
发生的事情很清楚。您读的第一行为空
(因为您在阅读内容时将'\n'
留在了信息流中
计数),然后用stream
对其进行解析,以stream
结尾
故障状态。一旦stream
处于失败状态,它
保持这种状态,所有进一步的操作都是禁运。
一般来说,您的代码有很多问题:
不要混合使用C风格的IO和iostream,尤其是不要将它们混合使用
文件。有时候,当您不得不面对时,这是不可避免的
旧版库,但不要故意这样做。事实上,
从来没有任何理由在C ++中使用C风格的IO。
不要在顶部定义所有变量。不要定义
直到您需要它们为止。特别是,没有意义
声明字符串流,直到进入循环(
可以避免您遇到的问题)。
使用前请先检查std::getline
是否成功
您已阅读的值。
做这种事情的惯用方式
向量的向量,带有push_back:
std::vector<std::vector<int>> val;
// and for the loop...
std::string line;
while ( std::getline( std::cin, line ) ) {
val.push_back( std::vector<int>() );
std::istringstream parse( line );
int i;
while ( parse >> i ) {
val.back().push_back( i );
}
}
除了,也许还有更多的错误检查。 (
parse >>i
中的while
是否失败,因为它已读取所有行,或者因为有人将
"abc"
当作数字?)09-07 09:51