10

これはまったくの初心者の質問かもしれませんが (私は長い間 C に触れていません)、なぜこれが機能しないのか誰か教えてもらえますか?

printf("Enter command: ");
bzero(buffer,256);
fgets(buffer,255,stdin);

if (strcmp(buffer, "exit") == 0)
    return 0;

「exit」を入力してもifに入らないのですが、「buffer」の長さと関係がありますか?

助言がありますか?

4

5 に答える 5

6

他の人が言ったように、バッファに改行が含まれているため、との比較"exit"は失敗しています。fgets()その保証の 1 つは、入力された行がバッファーに対して長すぎる場合を除き、バッファーが改行で終了することです。fgets()また、バッファがヌルで終了することを保証するため、256 バイトをゼロにする必要はありませんが、fgets()その保証を得るために 255 を使用するだけです。

正確に比較するという簡単な答えは"exit\n"、ユーザーが単語の前後に誤って空白を追加していないことを必要としていました. ユーザーにexitコマンドに注意を払わせたい場合は問題にならないかもしれませんが、一般的にはユーザーの迷惑になる可能性があります。

を使用すると、 、 、およびその他が不要な場所に一致するstrncmp()可能性があります。特に一部の有効なコマンドが他の有効なコマンドのプレフィックス文字列である場合は、これがうまくいかない可能性があります。"exited""exit42"

一般的なケースでは、I/O、トークン化、解析、およびアクションをそれぞれのフェーズに分離することをお勧めします。

于 2009-06-09T01:46:50.590 に答える
1

このように、文字列の末尾から \n を削除することをお勧めします。

char buf[256];
int レン;
/* 文字列を取得し、null バイトの余地を残しておきます */
if ( fgets(buf,sizeof(buf) - 1) == EOF )
{
  printf("エラー\n");
  出口 (1);
}
/* 絶対に常に null で終わる、簡単な方法 */
buf[sizeof(buf) - 1] = '\0';
/* 長さを計算し、\n があれば切り捨てます */
len = strlen(buf);
while ( レン > 0 && buf[レン - 1] == '\n' )
{
  buf[len - 1] = '\0';
  --len;
}

そうすれば、入力された文字列をいくつかの定数と比較する必要がある場合、それらすべてに \n を追加する必要がなくなります。

于 2009-06-09T01:55:04.643 に答える