2013-08-04 106 views
2

所以我遇到了以下問題。我的目標是創建一個循環,不斷輸入用戶輸入,直到用戶沒有向'cin >>'輸入任何內容,將行保留爲空,並且只需按下ENTER鍵即可繼續,此時程序應該打破循環,繼續執行其餘的程序。事情是這樣的:保持循環,直到用戶輸入空白行?

do { 
    cout << "\nEnter a name: "; 
    cin >> input1; 
    if (input1.empty()) 
    { 
     break; 
    } 
    else 
    { 
     user_name = input1; 
    } 
    } while (!input1.empty()); 

正如你所看到的,我已經用空()函數嘗試過,但沒有奏效,程序則只是停留在循環,並沒有打出去,沒有問題我按了多少次輸入。它只是不斷提示我輸入一個名字。我也試過使用類似

if (input1 == "") 

但這也不工作。誰能幫忙?我如何擺脫這個循環?

更新:好吧,我試過你的建議,它的工作!非常感謝!不幸的是,雖然getline函數有效,但它也爲我創造了一個新問題。基本上,在第一個初始循環中,程序提示輸入名稱,輸入名稱,名稱存儲在user_name中。然而,在SECOND循環中,程序甚至沒有給我輸入任何輸入的機會,它只是輸出「Enter a name:」,然後立即退出循環,並繼續執行其餘的程序執行。這是爲什麼發生?

+0

input1有什麼類型?的std :: string? –

+0

你是否在每個if語句之後刷新/清除input1?如果您在第一次運行中直接按Enter,會發生什麼情況? –

回答

4

改爲使用std::getline(cin, input1);從控制檯讀取一行。

使用cin直接讀取正好從標準輸入的一個字。如果用戶沒有輸入任何內容,則不會輸入任何字,並且cin也不會返回(您的空檢查甚至不會執行)。 BTW

std::getline(cin, input1); 
    if(input1.empty()) 
     break; 

使用後std::getline您可以留下您的空支票,是在C++中,你也應該檢查底層流遇到了一個錯誤。因此請檢查cin或getline的返回碼。這可以用下面的代碼來完成:

if(!std::getline(cin, input1)) 
    // I/O error 
+0

嗨,大家好,感謝您的建議,他們真的幫了大忙。但是,儘管getline函數有效,但它也爲我創建了一個新問題。基本上,在第一個初始循環中,程序提示輸入名稱,輸入名稱,名稱存儲在user_name中。然而,在SECOND循環中,程序甚至沒有給我輸入任何輸入的機會,它只是輸出「Enter a name:」,然後立即退出循環,並繼續執行其餘的程序執行。這是爲什麼發生? –

+0

也許在一個新問題中顯示你的新代碼,你最有可能做其他錯誤。例如。你可能會在它之間的某個地方出現一個「cin >>」,它會在流中留下「換行」字符 - 然後由getline()讀取。 –

+0

@GribblesChan:假設你在循環中有一個「cin >>」。之後放置cin.ignore()。 – MasterJedi

5

使用此getline(std::cin, input1)

while (getline(std::cin, input1)) 
{ 
    if (input1.empty()) 
     break; 
    username =input1; 
    std::cout << input1 << std::endl << "Enter Input : "; 
} 
+1

或更好,getline(...)&&! input1.empty()'。 – Potatoswatter

+0

@Patatoswatter是的。每當你看到一個'break'被用來退出一個循環時,這是一個好兆頭,程序員並沒有真正想到他在做什麼:循環不變和其餘部分。 –

2

一般來說,循環,直到輸入了一個空行是:

while (std::getline(line) && !line.empty()) ... 

如果您需要提示:提示是輸入邏輯的一部分,並且 應該如此實現:

std::string 
getlineWithPrompt(std::string const& prompt) 
{ 
    std::cout << prompt; 
    std::string results; 
    return std::getline(std::cin, results) 
     ? results 
     : std::string(); 
} 

你再這樣做:

std::string line = getlineWithPrompt("prompt for first line"); 
while (!line.empty()) { 
    // ... 
    getlineWithPrompt("prompt for further line"); 
} 

(這實際上是有些簡化,因爲它把硬錯誤 輸入,文件的末尾,空行相同的,這是 很少正確的事在專業軟件。但對於 學習的目的,它應該是足夠的。)

0

這工作,以及:

char line[128]; 

do 
{ 
    cout << "Enter something: "; 
    gets(line); 
} while (strcmp(&line[0], "\0") != 0); 
+0

請考慮使用[codereview.stackexchange.com](http://codereview.stackexchange.com/)以改善您的編碼風格。 –

0

CIN不會看你調用一個空行的空白。 Getline可能會這樣做,但我不完全確定。你可以定義一個結束字符,用戶可以輸入並檢查。獲取也可以工作,它只會將起始字符設置爲0x0。請注意gets(),它容易導致緩衝區溢出。

0

@JamesKanze

所以像這樣的東西退出while循環?

string str = "foo"; 
while (str == "foo"){ 
    getline(cin, str); 
} 
str = "foo";