如何优雅的写C++小程序?

1 篇文章 0 订阅
0 篇文章 0 订阅

近日,在不断的写程序的生涯中,我悟了!倘若给我一个时间间隙修炼个十年八年的话,C++的一切都会不在话下吧!应该!

——————废话和正文的分界线——————

  1. 本篇采用问题·解答的方式来记录本人遇到的C++的小问题及解决方案,各方案都是实践过的。
  2. 希望在不断的积累小问题和解决方案的过程中使我们使用C++更优雅,更得心应手

————————真·正文分界线——————————

  1. 重复读取数字问题
    一段代码:
int i = 0;
cout << "Please input the number of donation: " << endl;
cin >> i;

Q:如何做到只读取数字,且能在用户误输入非数字时循环请求输入?
A:最好的方法是借助cin本身的特性:cin本身是istream类的对象,与标准输入流绑定(一般就是键盘)。它自带两个错误标志,正常都是true。当读取类型不匹配时,其中一个错误标准将置false。只要有一个错误标准是false,成员函数cin.good()返回值将是false,否则就是true···
Q:哦!懂了,改成

do{
        cout << "Please input the number of donation: " << endl;
        cin >> i;
    }while(!cin.good());

就可以了吧?
A:错!我还没说完,cin的错误标志只要有一个是false,它就拒绝读取字符流!因此,要在循环体里面加上cin.clear()才行!它的作用是重置错误标志。但是仅仅是这样还没办法达到预期的结果,因为cin在遇到类型不匹配的读取时,将保留该字符在输入缓冲区!因此必须想办法清空输入缓冲区。常用的办法是用cin.sync()函数,该函数能清空输入缓冲区···
Q:懂了懂了,只要加两个函数就可以了吧?改成

do{
        cout << "Please input the number of donation: " << endl;
        cin.sync();
        cin.clear();
        cin >> i;
    }while(!cin.good());

诶,怎么会出现死循环······
A:当然会死循环了,我还没说完···在cin.good()值为false的情况下,cin.sync()无法发生作用!因此,你错在两个函数二者的顺序!另外,cin对象本身能被强制转换为bool类型,其值正是cin.good()的值,因此优雅的完成这个任务应该是:

do{
        cout << "Please input the number of donation: " << endl;
        cin.clear();
        cin.sync();
    }while(!(cin >> i));

Q:awsl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值