1

最初の投稿なので、プロトコルを破った場合はお詫びします。

私は学校のためのばかげたプログラムに取り組んでいます、そして私は次のコードを持っています。

cout << "//Dictionary Program//\n\n";
cout << "Enter a command:\n's' - to search for a pattern at the beginning\n";
cout << "'e' - to search for a pattern at the end\n";
cout << "'c' - to search for a pattern anywhere in the word\n";

//Gather user input.
cout << "Please enter a command ('q' to quit): ";
cin >> userCommand;

cmdCheck = userCommand.find("secq");

while(cmdCheck < 0 || userCommand.length() > 1){
    cout << "Please enter a valid command\n";
    cin >> userCommand;
    cmdCheck = userCommand.find("secq");

}

これはメニューを駆動していて、入力を検証しようとしています。1文字で、次の「secq」のいずれかである必要があります

  1. 即時ウィンドウのstring.find()でひどい時間を過ごしています。最終的にCXX0047になります:エラー:引数リストが関数と一致しません。他の場所で使っているので全くわかりません。

  2. while状態は私には良くありません。プログラムに「v」を指定すると、最終的にはブロック内になりますが、cmdCheckが0と評価される「s」を指定すると、-1が返され、ブロック内に留まります。

  3. 最後に、cmdCheckを使用して別のエラーをコーディングしましたが、while条件でそれが発生し、どちらも機能しませんでした。while(userCommand.find("secq") < 0 ...

私の最初の考えは入力バッファの問題でしたが、ローカルウィンドウでuserCmd変数を見ると、サイズ1の文字配列があります。文字だけがあり、バッファからのジャンクはありません(私が知る限り)

たくさんのネクタイができることはわかっています|| 各コマンドと一緒ですが、これは私の意見ではもう少しエレガントです。去年の決勝戦を見ましたが、条件文は醜いものでした。現時点では、それは原則の問題です。

4

4 に答える 4

1

文字列で getline を使用して入力を取得します。

getline (cin, userCommand) ;

入力が 1 文字の場合は、1 文字で受け取ります。文字列で取得することを主張する場合は、最初のインデックスを使用して確認してください。

于 2012-09-02T12:50:23.293 に答える
1

だと思いuserCommandますstd::string。コマンドは 1 文字であるためchar、文字列の代わりに a を使用します。次に、値をステートメントの引数として使用しswitch、有効な文字の適切なケースとdefaultエラー メッセージを表示するケースを指定します。

于 2012-09-02T12:50:26.977 に答える
1

式は で文字列をuserCommand.find("secq")見つけようとします。それの音から、あなたは実際には正反対のことをしたい、つまり文字列で を見つけたい:"secq"userCommanduserCommand"secq"

std::string::size_type cmdCheck = std::string("secq").find(userCommand);
while (cmdCheck == std::string::npos) {
    ...
}

std::stringを返さないことにも注意してくださいint。代わりに を返しますstd::string::size_type。これはtypedefforのint場合もありますがtypedef、別の整数型の場合もあります。渡された文字列がfind()見つからない場合は、std::string::nposが返されます。この定数の正確な値も定義されていないため、仮定を行うのではなく、この定数と比較することをお勧めします。

于 2012-09-02T13:02:49.947 に答える
0

おそらく、次のようなループの方が適切でしょう。

char result;
std::cout << "Your command: ";

for (std::string line; ; )
{
    if (!(std::getline(std::cin, line))
    {
        std::cerr << "Fatal error: Unexpected end of input!\n";
        std::exit(1); 
    }

    if (line.size() == 1 && line.find_first_of("secq") == 0)
    {
        result = line[0];
        break;
    }

    std::cout << "Sorry, I did not understand. Please say again: ";
}

std::cout << "Thank you! You said, '" << result << "'\n";

ループが壊れた場合result、ユーザー入力が含まれます。

于 2012-09-02T13:02:14.420 に答える