2012-02-11 13 views
1

私はC++でユーザからの入力文字列を受け取り、それを印刷し、別の文字列をもう一度入力して文字列を入力せずにリターンキーを押すまで印刷するプログラムを作成しています。その場合、プログラムは終了する必要があります。リターンキーを押すとプログラムを終了するには?

私は次のことを考え出しましたが、望みどおりに動作しません。何か案は?

int main(){ 

    string surname; 
    int c; 
    while (true) { 
     surname = ""; 
     cout << "Enter surname (RETURN to quit): "; 
     c = cin.get(); 
     if (c == '\n') { 
      break; 
     } 
     cin >> surname; 
     cout << surname << endl; 
    } 
    return 0; 
} 
+0

いいえ、私は自己学習しています。スタンフォードエンジニアリングEverywhere CS106Bの課題の一部です。 –

+0

私が言ったように、自己学習課題の小さな部分 - 4 http://see.stanford.edu/materials/icspacs106b/H09-Assign1SimpleC.pdf –

答えて

2

私はあなたの問題を解決することはできませんが、一緒にお手伝いします。

一度に1文字ずつ読む必要はなく、各行をstring変数に読み込むことができます。また、cin >> stringvariableの代わりにstd::getline(std::cin, stringvariable)を使用する必要があります。なぜなら、後者は、改行文字以外の文字になるまですべての改行をスキップします。

std::getlineを使用した後、文字列の長さを0と比較するか、またはemptyを呼び出して入力したかどうかを確認できます。

2

文字列を尋ねるとき、iostreamライブラリは常に1つの単語を返し、スペースは無視します。これはほとんどの状況で非常に便利です。しかし、あなたは空の文字列を検出したい場合は、文字を読む必要があり、それが最初の改行文字だかどうかを確認:

while(true) { 
    char c; 
    string surname; 
    cout << "Enter surname (RETURN to quit): "; 
    cin.get(c) 
    if(c == '\n') break; 
    cin >> surname; 
    if(c != ' ' and c != '\t' and c != '\n') 
    surname.insert(0, c); 
} 
return 0; 

注名前が1文字の長さである場合には、この解決策はいくつかの問題を持っていること。文字列全体を取得するには、cin.getを使用する必要があります...

2

対話型プログラムにはcin >>を使用することはお勧めしません。その振る舞いは明確に定義されていますが、ユーザー型入力では予期しないことがよくあります。代わりに、のようなものを使用します。

std::getline(std::cin, surname); 

以降では、ストリーム内のバッファリングデータのような奇妙な行動せず、これは、常にユーザーの種類までは原料の束をお待ちしておりますし、プレスが入力します。

5

このようにstd::stringを初期化する必要はありません。string surname; surname = "";これは必須ではありません。

あなたはgetline機能を使用して、この文字列は、このようなemptyであるかどうかを確認できます。

string surname; 
cout << "Enter surname (RETURN to quit): "; 
while (getline(cin, surname)) 
{ 
    if (surname.empty()) 
     break; 
    cout << surname << endl << "Enter surname (RETURN to quit): "; 
} 

は、この情報がお役に立てば幸いです。

関連する問題