Sstream无法正常工作

sstream not working properly?

本文关键字:工作 常工作 Sstream      更新时间:2023-10-16

我正在使用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;
}

这是测试用例:代码

不确定这是否是您的主要错误,但是您有一个n- scanf("%d",&n);之后的新行,SCANF仅抓住整数,剩下新的行,而Getline不读取您的输入。<<<<<<<<<<<<<<<<<<<</p>

您可以在拨打getline之前忽略以下新线路:

if ( isspace(cin.peek()) )
  cin.ignore();

另外,最好:

if ( stream >> temp ) {
   // do something with temp
}

现在,您始终将字符串添加为先前解析的值作为最后一个元素。

另外,您应该在再次使用之前清除StringStream,否则它处于错误状态,并且您无法使用它。添加此: stream.clear(); stream.str(s);

正在发生的事情很清楚。您阅读的第一行是空的(因为您在阅读时将'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 );
    }
}

,也许还有更多错误检查。(while中的parse >> i是否失败了,因为它已读取了所有行,或因为有人将"abc"滑入一个数字?)

scanf之后添加 cin.get ();-这会在您在 n中阅读的输入线末端消耗 n。之后,您将停止在矢量中毫无意义。cin.ignore(SOME_BIG_NUMBER)也可能工作,不仅跳过下一个字符(可能 n),还可以跳过它之前的空间。

您需要的另一个修复程序:在最内向的循环中,if(!stream) break;必须在 val[i].push_back(temp);之前,或者您将获得输入行上的最后一个INT的额外副本。

我进一步建议您使用流I/O或C风格I/O(printf,scanf)而不是两者 - 但这不是您的问题。