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(); 

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

发布了18 篇原创文章 · 获赞 8 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_20408397/article/details/83685307