讀取函數 |
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;
- }