C++中的輸入

讀取函數

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

  1. # include <stdio.h>
  2. int main(void)
  3. {
  4. char str[20]; /*定義一個最大長度爲19, 末尾是'\0'的字符數組來存儲字符串*/
  5. printf("請輸入一個字符串:");
  6. fgets(str, 7, stdin); /*從輸入流stdin即輸入緩衝區中讀取7個字符到字符數組str*/
  7. printf("%s\n", str);
  8. return 0;
  9. }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章