1
cout << "\nPlease enter x-ordinate: ";

cin >> test;
stringstream ss(test);
ss >> x;
while(ss.fail())
{
ss.str("");
cin.clear();
cin.ignore(256, '\n');  
cout << "Please enter integer: \n";
cin >> test;
stringstream ss(test);
ss >> x;
cout << x << ss;    
}       

こんにちは、sstream を使用して整数 x に変換できるかどうかを確認することにより、ユーザーの入力が整数かどうかをテストしようとしていますが、有効な整数を入力すると、while ループは依然として true であることが証明され、ループは続きます。誰でも助けてくれますか?

4

3 に答える 3

0

cinから にストリーミングしstring、 を作成しistringstream、そこからあなたの番号にストリーミングしても意味がありません。ユーザーに警告/エラー メッセージを生成するのではなく、 として扱われ、無視されるなど、余分なタイプのエラーの余地が残るだけ"12x"です12x

次のように直接読むことができます。

const char* prompt = "\nPlease enter x-coordinate: ";
while (cout << prompt && !(cin >> x))
{
    cin.clear();
    cin.ignore(256, '\n');  
    prompt = "Please enter integer: \n";
}

プロンプトを変更する必要がない場合は、ループに直接入れることができます。

while (cout << "\nPlease enter x-coordinate: " && !(cin >> x))
{
    cin.clear();
    cin.ignore(256, '\n');  
    std::out << "Please enter an integer.\n";
}

注: 最初の作業に少し似たものが表示されます。ここでは、stringではgetlineなくへの読み取りが使用>>されます。これは、行番号をカウントし ( よりもファイルの解析に役立つstd::cin)、行に表示される値を確認できるため、良い習慣になる可能性があります。他の期待されるデータと一緒に。それは次のようになります。

std::string line;
while (std::cout << "Enter coordinate:" &&
       getline(std::cin, line))
{
    std::istringstream iss(line);
    if (iss >> x)
         break;
    std::cout << "Error - invalid coordinate, please enter an integer\n";
}
...use x...
于 2016-04-21T11:27:55.823 に答える