2017-01-24 11 views
2

これは、ユーザーがテキストファイルに最大10語を入力できる非常に基本的なプログラムです。Break for forループを使用して

は、私はユーザーが特定の単語場合は、プログラムは私がstrcmpを使用しようとすると、ユーザが入力した単語と、「終了」を比較しています

停止することを終了節は、このような作りたいです。 両方が一致する場合は終了します。

{ 
char word[10]; 
FILE *fp; 
int x; 
int words = 0; 

fp = fopen("c:\\CTEMP\\ExamProg1.txt", "w+"); 

{ 

    for (x = 0; x < 10; x++) 

    { 
     printf("\nType the word you want to add. Type exit to terminate: "); 
     scanf("%s", word); 

     if (strcmp(word, "exit") == 0) 
     { 
      break; 
     } 

     fprintf(fp, "%s\n", word); 
     words++; 
    } 

    fclose(fp); 
} 

scanf_s("%d"); 

} 

私が代わりに二回「終了」を挿入することで、出口が入力されると、プログラムを破るために進むことができます方法:私は両方が同じであれば、それはしかし、私は書くことができません、0を返すことを知っていますか?

+1

'if(strcmp(word、" exit ")!= 0)' = 0でないときに処理を続けるようにすることができます。 –

+2

これはいっぱいですか?関数呼び出し結果が左辺値ではないと思います。 –

+1

はい、コンパイルします。しかし、 'break 'を含む私のif文は間違っています。 –

答えて

4

あなたのコードと間違って多数のものがあります。

  1. scanf("%s", &word);文字列は、それ自体のポインターまたは配列であることから、アドレス演算子はscanf場所への呼び出しに存在してはなりませんスキャンされた入力が文字列に読み込まれています。ちょうど使用:scanf("%s", word);

  2. strcmp(word, "exit")=0=演算子は代入演算子であり、比較演算ではありません(あなたが望むものはstrcmp(word, "exit") == 0です)。 strcmpの戻り値を正しく調べていないため、「exit」という単語のテストが失敗しています。

+0

あなたの洞察をお寄せいただきありがとうございますが、プログラムはまだこの時点で中断することはできません。私は終了するためにexitを2回タイプする必要があります。入力された最初の "exit"は、プログラムが最初の 'printf'文の実行を停止するように見えます。 –

+0

'gets()'はお勧めできません。なぜ、scanf( "%s"、word);と同じように長さの問題が無制限であるのを提案するのですか? – chux

+0

@chux私は自分のコードで 'scanf'の使い方が間違っていることを指摘していました。それは必ずしも 'scanf'を保証するものではありません。 –

2

あなたは可能性が高いとの言葉を読みたいと思うでしょう。そうのよう"exit"と比較し、その後 (scanf("%s",buf)gets(buf)のように、潜在的に巨大なセキュリティ上の危険である)

scanf("%99s", word); // where 99 == your buffer size - 1 
        //word is probably a pointer in your example so no & 

と:

if (strcmp(word, "exit")==0) 

ここには動作するダミーの例があります:

int main() 
{ 
    char buf[10]; 
    while(EOF!=scanf("%9s", buf)){ 
     printf("s=%s\n", buf); 
     if(strcmp("exit",buf)==0){ 
      puts("<exit>"); 
      exit(0); 
     } 
    } 
    if(feof(stdin)) 
     puts("<EOF>"); 
    else 
     puts("<ERROR>"); 

} 
+0

こんにちは、あなたの提案に感謝します。このコードは私のためにも機能しますが、通常のbreak文を使用することで、これの「より単純な」(?)バージョンを実装したいと思っています。 '== 0'を含めることによって、私はまだ正しく終了していません。 –

+0

@RyanRizzo 'exit(0)'は 'break'と同じです。とにかく、 'break'はあなたの例の' for'ループとなる最も近い囲むループを壊します。なぜプログラムの終了に至らないのかは、あなたが表示していないコードに完全に依存します。 – PSkocik