1

現在取り組んでいるプログラムをいじっているだけで、これに出くわしました。このプログラムはクライアント/サーバー型であるため、クライアントがユーザーにコマンドを要求し、サーバーがすべての実行を実行します。「exit」コマンドを入力すると、クライアントは停止します。私は使用しています

if (strncmp ("exit", command, strlen (command) - 1)) == 0)
{
         //Perform exit code
}

「exit」が入力されているかどうかを確認します。「a」と入力すると、「exit」が入力されたかのようにプログラムが終了します。大したことではありませんが、なぜそれが起こっているのか疑問に思っています。

ありがとう。

4

4 に答える 4

1

を使用するだけstrcmpです。

strlen("a")1 を返します... 1 マイナス 1 => ゼロ。3 番目のパラメーターはゼロであるため、両方の文字列strncmpをテストせずに「最大長」に達しました。char

于 2013-12-02T19:26:11.317 に答える
1

何が起こるか: を入力する"a "と、コマンドを区切るコードにより、文字列が(スペースなし)commandに等しくなります。"a"その長さは 1 です。次に、コードは を呼び出し、最初の文字をゼロstrncmpにして比較するように指示します。"exit"比較はまったく行われないため、この比較は常に成功します。

式から削除しても問題が解決しない場合があることに注意してください-1。これは、入力するとコードが終了するためです"e "(もちろん、それ目的の動作である場合を除きます)。コマンドが実際"exit"に であることを確認するには、次の条件を使用できます。

if ( strlen(command) == 4 && strncmp("exit", command, 4)) == 0 ) ...
于 2013-12-02T19:27:24.907 に答える
0

strlen(command)のゼロ以外の文字数を返しますcommand。終端のゼロ文字は含まれません。したがって、strlen(command) - 1はゼロ以外の文字の数よりも 1 少なくなります。command「a」を含む場合strlen(command) - 1は 0 です。

次にstrncmp("exit", command, strlen(command) - 1)、「exit」のゼロ文字と のゼロ文字を比較しますcommand。空の文字列は空の文字列と等しいため、ゼロ文字を比較した結果は常に等しくなります。これを修正するには、ゼロ文字を比較しないでください。渡された長さを必要な長さに変更するか、文字列全体を比較するためにstrncmp使用します。strcmp

文字列「exit」全体を の文字列全体と比較する場合はcommand、次を使用します。

if (strcmp("exit", command) == 0) …

commandコマンド「e」、「ex」、「exi」、および「exit」が「exit」に受け入れられるように、「exit」の省略形を許可する場合は、次を使用します。

if (strncmp("exit", command, strlen(command)) == 0) …
于 2013-12-02T19:44:48.753 に答える
0

a長さを入力するcommandと になります1。長さ-1を比較しようとしているので、0. strncmpどの文字もテストしません。

commandタイプがあると思いますchar[MAX_BUFFER]。これを 3 番目のパラメーターとして渡すことをお勧めMAX_BUFFERします。

于 2013-12-02T19:26:43.537 に答える