您的位置:首页 > 编程语言 > C语言/C++

stringstream string转换成long型遇到的问题

2016-07-13 18:18 281 查看
程序目的是从键盘的数字保存为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(“”);清空缓存即可。

正确运行结果就不贴了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ string 异常 缓存