Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ sstream不能正常工作?_C++_String_Integer - Fatal编程技术网

C++ sstream不能正常工作?

C++ sstream不能正常工作?,c++,string,integer,C++,String,Integer,我正在使用sstream解析字符串。该字符串包含由空格分隔的任意数量的整数。但是sstream没有正确解析输入。这是我的密码- #include<cstdio> #include<cstring> #include<vector> #include<cstdlib> #include<sstream> #include<iostream> using namespace std; vector<int> va

我正在使用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;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
向量val[10010];
int main(){
内部n,i,j,温度;
溪流;
字符串s;
scanf(“%d”和“&n”);
向量::迭代器;
对于(i=0;i>temp;
val[i]。推回(温度);
如果(!流)
打破
}
for(it=val[i].begin();it!=val[i].end();it++)
printf(“%d”,*it);
printf(“\n”);
}
返回0;
}

以下是测试用例:

不确定这是否是您的主要错误,但您在
\n
-scanf(“%d”,&n)”之后有一个新行;,scanf只抓取整数,新行保留,getline没有读取您的输入

在调用getline之前,您可以忽略下面的新行:

if ( isspace(cin.peek()) )
  cin.ignore();
此外,最好:

if ( stream >> temp ) {
   // do something with temp
}
现在,您总是添加带有先前解析的值的字符串作为最后一个元素

另外,在再次使用stringstream之前,您应该清除它,否则它将保持错误状态,您将无法使用它。添加以下内容:
stream.clear();
stream.str之前;
添加
cin.get()
在扫描之后——这将消耗输入行末尾的\n,您正在读取
n
。之后,您将不再在向量中获取无意义的内容。
cin.ignore(一些大数字)
也可能起作用,不仅跳过下一个字符(可能是\n),而且跳过它前面的空格

您还需要另一个修复方法:在最内部的循环中,
if(!stream)break;
必须位于
val[i]之前。向后推(temp);
,否则您将在输入行上获得最后一个int的额外副本


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

发生的事情很清楚。您阅读的第一行是空的 (因为您在读取 计数),然后用
解析它,在中以
结尾 失败状态。一旦
处于失败状态,它 保持这种状态,所有进一步的行动都不是行动

更一般地说,您的代码存在许多问题:

  • 不要混合使用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 );
    }
}
std::vector val;
//对于循环。。。
std::字符串行;
while(std::getline(std::cin,line)){
val.push_back(std::vector());
std::istringstream解析(行);
int i;
while(解析>>i){
返回值()推回(i);
}
}
也许,除了更多的错误检查。(是不是
parse>>
中的i
,而
由于读取了所有行而失败,或者
因为有人在代码中滑动了<代码> ABC >代码>为什么要跨越流?如果你要用C++流来解析,你也可以用它们来输入和输出。可能链接被破坏了。这里似乎缺少的是Skip。是的。谢谢。如果(流>临时)有什么不同?make?如果流解析失败,它将阻止您将temp插入向量。当前它将包含以前解析的值,因此您将有重复的值。仍然存在问题。以下是我尝试过的一些值。您的代码看起来不错,您尝试过在ideaone外部测试它吗?可能在ideaone中实际有\r\n而不是\n字符?是的,它是工作正常。在复制粘贴过程中,一些空格悄悄进入。这导致了错误。这在几个级别上是不正确的。首先,
cin.get()
不使用
“\n”
;它使用下一个字符(可能是尾随空格)。您绝对需要使用ignore。当然,除了第一次输入没有意义之外。将从流中读取的内容放入循环中,然后使用
while
,没有意义;有更好的编写方法。