2009-06-09 37 views
6

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

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

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

「終了」と入力した場合は、「終了」と入力されますが、「バッファ」の長さと関係がありますか?

提案がありますか?

答えて

18

:あなたの文字列を入力してを押しますと、「入力」、である

strcmp(buffer, "exit\n")

を、改行がbufferの一部になります。のみストリング

+4

ユーザーが終了する前または後にスペースを入力しない限り、それは良いことです。エクアドルが追加されたときに働いていなかったシステムの(おそらく外人の)物語を忘れないでください。首都の名前にキトーをタイプしなければならず、プログラムは終了しました。 '終了する'。かなり厄介! –

+3

@ジョナサンの真実!私自身の提案は、ユーザーがあなたのプログラムに何も入力することが決してできないようにすることです。 – poundifdef

9

fgets()は "exit \ n"という文字列を返します。gets()とは異なり、改行は保持されます。あなたがこれを行うにしたい

+0

... "gets"は1つのパラメータ(この例ではバッファ)のみをとります。ありがとう! – juan

+8

(get()は公開しないでください) – Dave

+0

@Daveなぜですか? –

5

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

ちょうど"exit\n"と比較すると、ユーザーが誤って単語の前後に空白を追加しないようにする必要がありました。ユーザーにexitコマンドを慎重に実行させたい場合には問題ありませんが、一般的にユーザーの煩わしさの原因になることがあります。

を使用すると、"exited","exit42"などの可能性があります。有効なコマンドが他の有効なコマンドのプレフィックス文字列である場合は、それがあなたにとってうまくいくかもしれません。

一般的には、I/O、トークン化、解析、およびアクションをそれぞれの段階に分けることをお勧めします。

+0

使用法:fgets(buffer、sizeof(buffer)、fp); fgets()がうまく動作するので、あなたはそれがどれくらいのスペースを持っているかを教えて、それがもはやそれを使用しないようにして、ヌルターミネータを配列の最後に利用可能な文字に置きます。 –

+0

私が言っていることを正確には...しかし、より良いと言いました。 ;-) – RBerteig

0

このように文字列の最後から\ nを取り除くことをお勧めします。

 
char buf[256]; 
int len; 
/* get the string, being sure to leave room for a null byte */ 
if (fgets(buf,sizeof(buf) - 1) == EOF) 
{ 
    printf("error\n"); 
    exit(1); 
} 
/* absolutely always null-terminate, the easy way */ 
buf[sizeof(buf) - 1] = '\0'; 
/* compute the length, and truncate the \n if any */ 
len = strlen(buf); 
while (len > 0 && buf[len - 1] == '\n') 
{ 
    buf[len - 1] = '\0'; 
    --len; 
} 

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

+0

なぜdownvote?それは説明されていませんが、有効な解決策です。 –

関連する問題