0

私は次のコードを実装しようとしているプログラムを書いています:

int main(){

string inputcmd;


while (getline(cin, inputcmd)){
    cout << "TYPE A COMMAND" << endl;   
    cin >> inputcmd;

    cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); 

    if (inputcmd == "make"){
        cout << "MAKING NEW PROJECT" << endl;
        get_project(cin);
    }

    else if (inputcmd == "retrieve"){
        cout << "RETRIEVING YOUR PROJECT" << endl;
    }
}

return 0;
}

cin.ignore プロパティを使用して、その時点でバッファに現在存在する改行文字のバッファをクリアしようとしていますが、コンパイルしようとすると意味不明なコンパイラ エラーが発生しますか? これはなぜですか?これを修正するにはどうすればよいですか?

4

3 に答える 3

0

入力を 2 回読み取るため、余分な改行を押す必要があります。最初はgetlineで、2 回目は でcin >> ...

コマンドに引数を付けることができる場合は、呼び出しとcin >> ...一緒にその部分を削除し、 and のみを使用することをお勧めします。cin.ignore()getlinestd::istringstream

std::cout << "Enter command: ";
while (std::getline(std::cin, line))
{
    std::istringstream iss(line);

    // Get the command
    std::string command;
    iss >> command;

    if (command == "make")
    {
        ...
    }
    ...

    std::cout << "Enter command: ";
}

このようにして、スペースで区切られた引数をコマンドにも簡単に取得できます。

はい、プロンプトを 2 回出力するコードがありますが、私の意見では、それは小さくて無視できる問題です。


または、さらに一般化したい場合は、たとえば a を使用std::vectorしてコマンドと引数を保存し、次のようにします

std::cout << "Enter command: ";
while (std::getline(cin, line))
{
    std::istringstream iss(line);

    std::vector<std::string> args;

    // Get the command and all arguments, and put them into the `args` vector
    std::copy(std::istream_iterator<std::string>(iss),
              std::istream_iterator<std::string>(),
              std::back_inserter(args));

    if (args[0] == "make")
    {
        ...
    }
    ...

    std::cout << "Enter command: ";
}

たとえば、次の参照を参照してください。

于 2013-11-06T09:02:47.387 に答える