0

ユーザーに名前を入力するように求めるループがあります。ユーザーが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++;


}
4

5 に答える 5

4

読み取った文字列を次の整数に変換しますatoi

int enterKey = atoi(temp.c_str());        

tempが"1234"このような文字列の場合、はに設定さenterKey1234ます。enterKey次に、のASCII値と比較します\n。これはおそらく何も役に立たないでしょう。

またstd::getline、次の文字までの文字を読んでください。ただし、次の文字は含まれていません'\n'。ユーザーが他の文字を入力せずにEnterキーを押すだけの場合、std::getlineは空の文字列を返します。empty()文字列が空の場合は、そのメソッドで簡単にテストできます。

getline(cin, temp);
if (temp.empty()) {
  stop = true;
}
于 2010-05-10T14:52:31.680 に答える
2

試す:

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);
}
于 2010-05-10T14:46:21.000 に答える
2

getlineは区切り文字('\ n')を使用するため、空の文字列をチェックする必要があります。atoiに電話する前にそれをしてください。

于 2010-05-10T14:50:37.497 に答える
1

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;
于 2010-05-10T14:52:06.807 に答える
0

cin.get();を使用します。cin >> temp; 私は信じています。

于 2010-05-10T15:08:45.103 に答える