3

だから私は次の問題に遭遇しました。私の目標は、ユーザーが「cin >>」に何も入力せず、行を空白のままにし、ENTER キーを押して先に進むまで、ユーザー入力を何度も取得し続けるループを作成することです。ループから抜け出し、残りのプログラム実行を続行することになっています。このようなもの:

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

ご覧のとおり、既に empty() 関数を使用してみましたが、うまくいきませんでした。プログラムは単純にループにとどまり、Enter キーを何度押しても抜け出しません。名前を入力するように促され続けます。私も次のようなものを使用してみました

if (input1 == "")

しかし、それもうまくいきません。誰でも助けることができますか?このループから抜け出すにはどうすればよいですか?

更新: OK みんな、私はあなたの推奨事項を試してみましたが、うまくいきました! どうもありがとう!残念ながら、getline 関数は機能しますが、新しい問題も発生しました。基本的に、最初の最初のループで、プログラムは名前の入力を求めます。名前を入力すると、名前が user_name に格納されます。ただし、2番目のループでは、プログラムは入力を入力する機会さえ与えず、単に「名前を入力してください:」と出力し、すぐにループを終了して、残りのプログラム実行を続行します。 . なぜこうなった?

4

6 に答える 6

7

これを使用しますgetline(std::cin, input1)

while (getline(std::cin, input1))
{
    if (input1.empty())
        break;
    username =input1;
    std::cout << input1 << std::endl << "Enter Input : ";
}
于 2013-08-04T09:46:55.497 に答える
4

std::getline(cin, input1);代わりに、コンソールから行を読み取るために使用します。

を直接使用すると、stdin から正確に1 つの単語がcin読み取られます。ユーザーが何も入力しない場合、単語は指定されておらず、まだ返されません (空のチェックは実行されません)。cin

使用後はstd::getline、空小切手をそのままにしておくことができます。

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

ところで: C++ では、基になるストリームでエラーが発生したかどうかも確認する必要があります。そのため、cin または getline の戻りコードを確認してください。これは、次のコードで実行できます。

if(!std::getline(cin, input1))
    // I/O error
于 2013-08-04T09:45:29.407 に答える
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" );
}

(これは、入力、ファイルの終わり、および空の行のハードエラーを同一に扱うため、実際にはいくらか単純化されています。これは、プロのソフトウェアではめったに正しいことではありません。しかし、学習目的では、それで十分なはずです。)

于 2013-08-04T11:38:43.210 に答える
0

Cin は、空行と呼ばれる空白を読み取りません。Getline がこれを行う可能性がありますが、完全にはわかりません。ユーザーが入力してチェックする終了文字を定義できます。Gets も機能し、開始文字を 0x0 に設定するだけです。gets() には注意してください。バッファ オーバーフローが発生する傾向があります。

于 2013-08-04T12:07:20.577 に答える
0

これも同様に機能します:

char line[128];

do
{
    cout << "Enter something: ";
    gets(line);
} while (strcmp(&line[0], "\0") != 0);
于 2013-08-04T11:49:53.587 に答える