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

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

正确运行结果就不贴了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值