This question already has an answer here:
How to clear stringstream? [duplicate]
                                
                                    (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