C/C++中gets和cin.getline()效率问题

在做算法题的时候,很多时间需要用到取一行的数据,在对比了C语言的gets函数与C++ STL库中的cin.getline()函数之后,发现gets的运行效率更高,造成这一现象的主要原因:

应该是

cin.getline:需要传入第二个长度参数,然后在检测的时候,需要多个传参以及在逐个检测字符时需要检测当前位置是否超过传进来的长度参数值

gets():则是直接跑,一直跑到遇到换行或者EOF。少了个长度检测长度

相对来说各有优缺点

cin.getline() 更加灵活,可控制传入的长度

而gets可能在用户输入不正确的时候,一般即一直没输入换行或者EOF字符,会超过一开始申请的内存空间,而导致内存溢出问题。

而前者的优点则是可传入固定大小,从而规避这个问题。

但这样做的同时也产生了一个明显缺点就是多了个长度判断,导致CPU运算量相对于gets来说增大了,在竞赛中,如果题目规定了输入长度,或者范围,而且题目保证输入是正常值(其实竞赛中后台检测数据一般也是严格筛选过后的),为了保证题目用时,应更偏向于使用gets,节约时间,在一个8000+行的数据,每行数据字符总量不超过25的时候,gets比cin.getline快了近50ms,详细数据没测试,但差距还是有点明显的。

但在正规项目中,如果输入数据,char*str中数据的长度不固定,或者说是不确定的时候,申请了固定储存的内存空间,则应偏向使用cin.getline,因为这相对于gets来说更安全,可减少出现内存溢出问题或者出现其他bug的风险。

cin.getline应该就差不多等同于:

cin.getline(c,length);

for(int i=0;i<length;i++)c[i]=getchar(); 

如本文内容理解有错,望纠正。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值