[英]C++ Detecting ENTER key pressed by user
我有一個循環,要求用戶輸入名稱。 當用戶按ENTER鍵.....或輸入20個名稱時,我需要停止。 但是,當用戶按下ENTER鍵時,我的方法不會停止
//loop until ENTER key is entered or 20 elements have been added
bool stop = false;
int ind = 0;
while( !stop || ind >= 20 ){
cout << "Enter name #" << (ind+1) << ":";
string temp;
getline(cin, temp);
int enterKey = atoi(temp.c_str());
if(enterKey == '\n'){
stop = true;
}
else{
names[ind] = temp;
}
ind++;
}
您使用atoi
將讀取的字符串轉換為整數:
int enterKey = atoi(temp.c_str());
如果temp是類似於"1234"
的字符串,則將enterKey
設置為1234
。 然后,將enterKey
與ASCII值\\n
。 這很可能沒有做任何有用的事情。
同樣std::getline
只能讀取直到(但不包括)下一個'\\n'
的字符。 如果用戶僅按Enter鍵而不輸入其他任何字符,則std::getline
將返回一個空字符串。 如果字符串為空,則可以使用其empty()
方法輕松測試:
getline(cin, temp);
if (temp.empty()) {
stop = true;
}
嘗試:
while( !stop && ind < 20 )
要么:
using namespace std;
vector <string> names; // edited.
for (int ind = 0; ind < 20; ++ind)
{
cout << "Enter name #" << (ind+1) << ":";
string temp;
getline(cin, temp);
if (temp.empty())
break;
names.push_back(temp);
}
getline將吃掉您的定界符,該定界符為'\\ n',因此您可能希望檢查空字符串。 在致電atoi之前先做。
嘗試改為stop = temp.empty()
。 getline
不應包含任何換行符。 空行應導致空字符串。
另外,Charles是正確的,您的while條件不正確,請使用while( !stop && ind < 20)
。 用戶的書寫方式需要輸入20個值和一個空行。 查爾斯的改變說,要滿足任何一個條件(不是同時滿足兩個條件)就打破。
為了完整起見,下面是建議的新代碼:
bool stop = false;
int ind = 0;
while( !stop && ind < 20 ){
cout << "Enter name #" << (ind+1) << ":";
string temp;
getline(cin, temp);
if(temp.empty()) {
stop = true;
} else {
names[ind] = temp;
}
ind++;
}
我個人將代碼編寫如下:
vector<string> names;
for(int ind = 0; ind < 20; ind++) {
cout << "Enter name #" << (ind + 1) << " (blank to stop): ";
string name;
getline(cin, name);
if(name.empty() || cin.eof()) {
break;
}
names.push_back(name);
}
cout << "Read " << names.length() << " names before empty line detected." << endl;
您想使用cin.get(); cin >> temp; 我相信。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.