2012-04-10 22 views
0

プログラム内でwhileループを作ってプログラムがwhileループに達しましたが、実行されません。私はずっと長い間コードを見てきたので、私が見逃している本当に小さなエラーがあるように感じます。whileループ実行中

int strbuf = 100; 
    char string[strbuf]; 
    char *exit = "exit"; 
    while(!strcmp(string, exit)){ 
     printf("Enter a word to search. Enter exit to quit"); 
     scanf("%s", string); 
     state = present(fIndex, string); 
     if(state){ 
     printf("The word %s was found on line %d", string, state); 
    } 
} 

EDIT:キーボードからの入力です。 編集編集:NEW CODE(同じ問題)

int strbuf = 100; 
char string[strbuf]; 
char *exit = "exit"; 

printf("Enter a word to search. Enter exit to quit\n"); 
scanf("%s", string); 
    while(!strcmp(string, exit)){ 
    state = present(fIndex, string); 
    if(state){ 
     printf("The word %s was found on line %d", string, state); 
    } 
    else printf("The word %s was not found", string); 
} 
+1

whileループの前に入力を取るとは思いませんか? 'string'は最初のループの繰り返しでゴミを持っています。 – Mahesh

答えて

3

strcmpのmanページを読む

を関数strcmp()関数は、s1とs2 2つの文字列を比較します。 は、が、それぞれs1が見つかった場合は0より小さい整数、より小さい、一致する、またはs2より大きい整数を返します。

あなたはマッチを持っている場合は、strcmpは0を返し、二つの文字列がない試合をすれば、それはゼロ以外の値を返します。

したがってwhile(!strcmp(string, exit))はの文字列が一致する間にと表示されます。

stringも未初期化で、ジャンクを含んでいるため、未定義の動作が発生します。ループを最初に実行するか、を少なくとも1回実行する必要がある場合はdo..whileループを使用してください。

+1

彼はそれを説明している。条件は '!strcmp(string、exit)'です。 – tnecniv

+0

ゼロの値は、両方の文字列が等しいことを示します。彼は、文字列が等しい場合でない限り、ループを実行したいと考えています。 while(strcmp(string、exit))は文字列が等しくなるまで実行されます。 –

+0

@paxdiablo:彼は 'while(!strcmp(string、exit))'を持っていますが、 'while(strcmp(string、exit))'または 'while(strcmp(string、exit)!=私は他の何かを間違えた?彼はユーザが '' exit "'を入力するまでループの中にいたいと思っています。それとも、ループの前に入力する必要があると思っているのですか? – AusCBloke

0

あなたはexitとそれを比較する前にstringの入力を取得されていません。 whileループの前に:

printf("Enter a word to search. Enter exit to quit"); 
scanf("%s", string); 

を入れてください。

+0

ドライ、ドライ、ドライ、ドライ、ドライ! :-) – paxdiablo

+0

eh?何か皮肉なことがありますか? – noMAD

+0

DRY = "自分自身を繰り返さない" - ループの前に入力する必要はありません。単に文字列を "終了"以外に設定するだけです。私がそれを5回言ったという事実は、私がそれを説明しなければならなかった事実によって役に立たなくなったメタユーモアの一形態です:-)それは大丈夫です、私の妻はしばしば私の奇妙なユーモアのブランドを理解していません。幸運なことに、毎日それに気づく必要はありません。 – paxdiablo

0

whileループが実行されていない場合、それは!strcmp(string, exit)strcmp(string, exit)がなければならないことを意味

偽であることを意味TRU(非0)が一致した場合は0を返すのstrcmp

は、そうstringはないが同じではありませんexit

この理由はありますか?あなたは決して文字列に値を入れません。それを "do while"ループに変更することを提案してください。

1

はい、です。 本体whileループは実行されていない可能性がありますが、何もしていないのは未定義の動作なので、stringを使用して何か有用なものに初期化されています。彼らは本当にブール値である場合を除き、あなたは(あなたの比較を展開する必要があり、読みやすさのために、

char string[strbuf] = {'\0'}; 

そして:

char string[strbuf]; 

へ:

簡単な修正は変更することですまた、いくつかの場所で「exit」をハードコーディングしているので、なぜ変数として使用するのかはわかりません。

while (strcmp (string, "exit") != 0) { 
0

さらに、exit()は標準のC関数です(stdlib.hを参照)。 strExitのようなものがあなたの目的に適しているかもしれません。

関連する問題