Sstream无法正常工作
sstream not working properly?
我正在使用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)而不是两者 - 但这不是您的问题。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程