2017-03-15 1211 views
-1

我有一個這樣的程序,檢測ENTER鍵在C++

char name[100]; 
char age[12]; 
cout << "Enter Name: "; 
cin >> name; 

cout << "Enter Age: "; 
cin >> age; 

現在的年齡是一個可選字段,所以用戶只需按下ENTER鍵,有一個空值。但問題是,cin不採用ENTER鍵,只是呆在那裏等待有效的鍵盤字符或數字輸入。

我認爲這個問題是因爲cin需要一個有效的輸入,因此永遠呆在那裏。

所以我嘗試了下面的方法來檢測ENTER鍵按Age。

cout << "Enter Age: "; 
if (cin.get() == '\n') { 
      cout << "ENTER WAS PRESSED" << endl; 
     } 

現在只要用戶在輸入名稱後按下ENTER鍵,就會直接進入IF條件。

我也試過:

getline(cin, age); 

但也根本沒有在cout << "Age: ";停止等待來自用戶的輸入。

用戶可以選擇有效年齡,也可以直接按ENTER鍵不輸入年齡。

對於下面的代碼:

cout << "Enter Name: "; 
     cin >> name; 

     cout << "Enter Age: "; 
     if (cin.get() == '\n') { 
      cout << "ENTER WAS PRESSED" << endl; 
     } 

輸出爲:

Enter Name: asdf 
Enter Age: ENTER WAS PRESSED 

我希望光標等待輸入年齡:_

我怎樣才能做到這一點?

+0

顯示你的整個代碼哪裏出了問題「當你輸入名字仍然進入,如果」 – Sniper

+0

更新的代碼和當前輸出。 –

+0

如果您希望光標在'Enter Age:_'處等待,那麼您想在哪裏看到輸出? –

回答

0

您是否嘗試過這個?:

cout << "Press Enter to Continue"; 
cin.ignore(); 

還檢查了this question

+0

我認爲加入cin.ignore()正在爲我工​​作。 –

0

您可能需要輸入一個char變量,然後檢查它是否爲ENTER鍵,如果不是,繼續獲取字符並將它們轉換爲int(使用字符減法和所有這些)。這不是一個非常漂亮的解決方案,但它是我頭腦中的第一件事。

0

你幾個問題,你的代碼:

  1. 您呼叫operator>>char[]緩衝區沒有從保護緩衝區溢出。使用std::setw()指定讀取期間的緩衝區大小。否則,請使用std::string而不是char[]

  2. cin >> name只讀取第一空格分隔單詞,留下的任何剩餘的數據在輸入緩衝器中,包括ENTER鍵,然後由cin >> age無需等待新的輸入拾取。爲避免這種情況,您需要撥打cin.ignore()來丟棄任何未讀數據。否則,請考慮使用cin.getline()代替(或std::getline()代替std::string),它會消耗所有包括換行符在內的所有內容,但不會輸出換行符(至少應該考慮將此值用於name值,以便用戶可以輸入名稱在他們的空間)。

  3. 默認情況下,operator>>在讀取新值之前跳過前導空白,並且包含換行符。你可以按輸入所有你想要的,operator>>會很高興地繼續等待,直到其他東西進入。爲避免這種情況,您可以使用std::noskipws,但在讀取字符數據時會導致不必要的副作用 - 輸入緩衝區中留有空白,導致operator>>在讀取任何用戶輸入之前讀取空白字符時會停止讀取。因此,爲避免這種情況,您可以在致電cin >> age之前使用cin.peek()檢查輸入的換行符。

嘗試更多的東西是這樣的:

#include <iostream> 
#include <limits> 
#include <iomanip> 

char name[100] = {0}; 
char age[12] = {0}; 

std::cout << "Enter Name: "; 
std::cin >> std::setw(100) >> name; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
/* or: 
if (!std::cin.getline(name, 100)) 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
*/ 

std::cout << "Enter Age: "; 
if (std::cin.peek() != '\n') 
    std::cin >> std::setw(12) >> age; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

或者:

#include <iostream> 
#include <string> 
#include <limits> 

std::string name; 
std::string age; 

std::cout << "Enter Name: "; 
std::cin >> name; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
/* or: 
std::getline(std::cin, name); 
*/ 

std::cout << "Enter Age: "; 
if (std::cin.peek() != '\n') 
    std::cin >> age; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
/* or: 
std::getline(std::cin, age); 
*/