關於C 中getline 函式的乙個陷阱

2021-07-11 01:21:10 字數 1615 閱讀 2821

最近寫**的時候遇到乙個問題,就是getline函式接受標準輸入(鍵盤)時,失效了。請先看**:

#include

#include

#include

using

namespace

std;

int main()

執行時沒問題的,先輸入乙個數字,再輸入你的名字,讓我們試試,結果如下:

讀者可以自己動手試試,會發現還沒有輸入名字,程式就已經結束了,這是為什麼呢?

我們略加修改**如下:

#include

#include

#include

using

namespace

std;

int main()

就是不在接受cin輸入,結果如下:

我們可以看到getline函式可以接受輸入了,情況一定是出在cin和getline上,樓主查閱資料發現:getline是讀取整行,一行結束的標誌就是輸入回車或者結束符,這種情況下空格也算合法字元被輸入,cin是讀到空格或回車都結束,空格也是它的結束標誌

也就是說,之前我們在輸入a的時候,會按回車鍵完成輸入,而我們沒有清空輸入流衝存區,所以getline讀取到回車號,直接返回空字串。

注意到cin還可以以空格符結束,所以我們可以在不改變**的基礎上這樣輸入:

輸入完第乙個的時候,以空格結束,再輸入名字最後回車,雖然這樣能夠滿足要求,但實際上是未卜先知,顯然是不好的解決方法。

前面已經提到getline從緩衝區得到回車號直接返回,我們將輸入緩衝區清理掉不就好了嗎,於是**如下:

#include

#include

#include

using

namespace

std;

int main()

注意加了2個與cin有關的函式,cin.clear()和cin.sync(),他們的作用在**中已經說明,讓我們執行一下:

不得不說的是getline有個好處遇到空格不會結束 對於某些情況只是很方便的一點。

順帶說一下也可以用cin.ignore()函式

string str2;

cin.clear();//重置cin輸入狀態

清楚cin緩衝區未讀資訊

cin.ignore(100,'\n');

getline(cin,str2);

關於C 中getline 函式的乙個陷阱

最近寫 的時候遇到乙個問題,就是getline函式接受標準輸入 鍵盤 時,失效了。請先看 include include include using namespace std int main 執行時沒問題的,先輸入乙個數字,再輸入你的名字,讓我們試試,結果如下 讀者可以自己動手試試,會發現還沒有...

C 中的getline 函式

getline 函式是c 庫函式。它會生成乙個包含一串從輸入流讀入的字元的字串,直到以下情況發生會導致生成的此字串結束。1 到檔案結束,2 遇到函式的定界符,3 輸入達到最大限度。我們一般用string輸入字串時不能讀取空格,我們可以用getline 函式從輸入流中讀取,getline 函式之前的回...

C 中的getline函式

c 中本質上有兩種getline函式,一種在標頭檔案 istream 中,是istream類的成員函式。一種在標頭檔案 string 中,是普通函式。一 在 istream 中的getline函式有兩種過載形式 istream getline char s,streamsize n istream ...