程序目的是从键盘的数字保存为long型,为了防止非法输入,现将输入保存为string类型,在使用stringstream类转换为 long型,屏蔽非法输入带来的问题。
- 问题:需要多次调用stringstream的对象,对象在使用过一次后再次使用时会出现异常,需要对缓存清空。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
prime uPrime;
long input;
stringstream ss;
string inputs;
while (true)
{
cin >> inputs;
ss<<inputs;
ss >> input;
cout <<"inputs:"<< inputs<<endl;
cout << "input:" << input<<endl;
cout << "Size of stream = " << ss.str().length() << endl;
//ss.str(""); //ss 清空缓存操作
ss.clear(); //重置标志位
cout <<endl<<"---------------"<< endl;
}
return 0;
}
- 解决方法 :
ss.str("");
ss.clear();
当输入完成后,数据已字符串的形式保存在ss的缓存中,如下图:
然后ss流输出转换后的结果保存在long 型的input变量中,这个过程如同读档案一般,串流已经读到结尾EOF,这个标志不是要输出的long类型,因此判定为error flag,ss终止操作。
4356 EOF
——^
要想继续使用ss,此时需要调用clear()函数重置标志位。注意!clear()不是清空缓存,而是重置标志位。重置错误标志位后,ss可以再次输入。
但是,我们会发现如下的问题,ss的缓存会越来越大。如下图所示:
这是因为,之前的输入保存在了缓存之中, 需要清除。注意,第3次输入结尾有一个负号,在转换为long型时,是错误数据类型,被留在了缓存中, 应该删去,但是在第4次输入时却作为了负号出现在了输出数据中。缓存空间也越来越大。
此时,调用ss.str(“”);清空缓存即可。
正确运行结果就不贴了。