读取函数 | gets | fgets | scanf | getline | cin |
所用时间 | 72ms | 76ms | 960ms | 2189ms | 2275ms |
我们可以发现gets和fgets函数读取字符串的速度是最快的,读取时间约为scanf函数的1/13,约为getline和cin的1/30,由于gets函数由于不安全已被c11标准废弃,在以后读取字符串时,如果字符串很长,应尽可能使用fgets函数。
另外,scanf函数的读取效率约为getline和cin的1/2,getline比cin稍快。
那么为什么会出现这样的情况呢?
以fgets函数和scanf函数为例,由于fgets只负责读取字符串,而scanf函数还可以读取其他如int、double类型的数据,所以scanf函数就多了确定读取的数据是何种类型的步骤,因而花费了更多的时间。
而getline和cin函数只能向string类型中读入数据,由于string类型是在堆上分配的,在读取数据的时候需要不断从堆上申请动态分配内存,不如char数组直接提前分配好了所有内存来得更为简便。此外在向string类型读入数据的时候,还需要调用string类型的构造函数,初始化包括begin()、end()、size()等类内数据成员和成员函数,这也花费了很多时间。所以string类型比char数组提供了许多使用更为简便的函数和成员,但也要为此承担时间上的代价。
在学习C++的过程中,经常会遇到输入输出的问题,以下总结一下下面几个函数的用法:
1)、cin
遇“空格”、“TAB”、“回车”都结束
2)、cin.get()
用法1: cin.get(字符变量名)可以用来接收字符
用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
3)、cin.getline() // 接受一个字符串,可以接收空格并输出
m[20];
cin.getline(m,5);
cout<<m<<endl;
4)、getline()
5)、gets()
6)fgets();
- # include <stdio.h>
- int main(void)
- {
- char str[20]; /*定义一个最大长度为19, 末尾是'\0'的字符数组来存储字符串*/
- printf("请输入一个字符串:");
- fgets(str, 7, stdin); /*从输入流stdin即输入缓冲区中读取7个字符到字符数组str中*/
- printf("%s\n", str);
- return 0;
- }