2

これが私のメインプログラムです。

int main () {

    string command;
    cin>>command;

    if(command == "keyword")
    {
        string str, str2, str3, str4;

        cout << "Enter first name: ";
        getline (cin,str);

        cout << "Enter last name: ";
        getline (cin,str2);

        cout << "Enter age: ";
        getline (cin,str3);

        cout<<"Enter country: ";
        getline (cin,str4);

        cout << "Thank you, " << str <<" "<<str2 <<" "<<str3<<" "<<str4<< ".\n";
    }
}

キーワードが入力されると、プログラムはすぐに出力します:

名を入力してください: 姓を入力してください:

名を入力する機能を完全にバイパスします。

4

3 に答える 3

3
string command;
cin>>command;

この後、行末を食べるだけです

string restOfLine;
getline(cin, restOfLine);

そうしないと、コマンドを入力した行の '\n' は消費されず、次の readline でそれだけが読み取られます。HTH

于 2010-11-01T07:35:04.673 に答える
3

cin >> command'\n'入力ストリームから改行文字 ( ) を抽出しません。あなたが呼び出すとき、それはまだそこにありますgetline()。したがって、これに対処するには、 getline()(または) への追加のダミー呼び出しが必要です。ignore()

于 2010-11-01T07:38:24.063 に答える
1

他の人が述べたように、問題はコマンドの読み取り中に行末文字をバッファに残していることです。@Armen Tsirunyan によって提案された代替手段に加えて、他の 2 つのアプローチを使用できます。

  • そのために使用std::istream::ignoreします: cin.ignore( 1024, '\n' );(行の幅が 1024 文字を超えないと仮定します。

  • cin >> commandに置き換えるだけgetline( cin, command )です。

どちらの選択肢も追加の文字列を作成する必要はありません。最初の選択肢はより弱く (非常に長い行の場合)、2 番目の選択肢はセマンティクスを変更します。これは、最初の行全体 (最初の単語だけでなく) がコマンドとして処理されるためです。より厳密な入力チェックを実行できるため、問題ない可能性があります (コマンドは最初の単語で必要に応じて綴られており、コマンド ラインに追加のオプションはありません。

異なるコマンド セットがあり、一部に引数が必要な場合は、コマンド ラインを一度に読み取り、そこからコマンドと引数を読み取ることができます。

std::string commandline;
std::vector<std::string> parsed_command;
getline( cin, commandline );
std::istringstream cmdin( commandline );
std::copy( std::istream_iterator<std::string>(cmdin), std::istream_iterator(),
           std::back_inserter( parsed_command ) );
// Here parsed_command is a vector of word tokens from the first line: 
// parsed_command[0] is the command, parsed_command[1] ... are the arguments
于 2010-11-01T08:53:23.327 に答える