2015-12-24 13 views
5

多くのテストの後、入力バッファの仕組みを理解していないために問題があると思います。C - ユーザ決定ベースのdo/whileループが正しく動作しない

私は、反復を停止するためにユーザーが「いいえ」と入力するまで繰り返し続ける必要があるwhileサイクルを持っています。

私には2つの問題があります。

  1. しばらくは関係なく、ユーザが「いいえ」に入るか、2サイクル目の出力に問題が見ることができるよう
  2. 「はい」と等しくないものは何でも反復するために停止したことはありません。プログラムはユーザーに文字列の入力を要求せず、そのステップをスキップします。ユーザーはENTERだけを入力します。

CODE:

int foo = 0; 

do{ 

    int i, cycles; 
    char array[MAX_LENGTH+1]; 



    for(cycles=0; cycles < MAX_READ_CYCLES; cycles++){ 

    i=0; 

    printf("\n\nEnter a string: "); 

    char ch; 
    while ((ch = getchar()) != '\n' && ch != EOF) { 
     array[i] = ch; 
     i++; 
    } 

    array[i] = '\0'; //string terminator 


    printf("String you entered: %s\n", array); 

    printf("\nDo you want to continue? 1: yes/0: no \n"); 
    scanf("%d", &foo); 

    } 

} while(foo == 1); 

OUTPUT

Enter a string: test 
String you entered: test 

Do you want to continue? 1: yes/0: no 
0 

Enter a string: String you entered: 

Do you want to continue? 1: yes/0: no 
3 

Enter a string: String you entered: 

Do you want to continue? 
+1

を見ます入力した文字列の出力の後に 'fflush(stdin)'を試してください。 – Mxsky

+0

残念ながら、 'fflush(stdin)'を置いてもまだ正しく動作していません。プラス私は未定義の動作があるので、fflush(stdin)の使用を避けるように言われました。 – fbid

+0

ここにあなたの答えです:http://stackoverflow.com/questions/16908008/scanf-getchar-working-correctly-only-first-time-through-loop – Mxsky

答えて

5

ユーザーがいるため、内側forループの"yes"を入力した場合、プログラムが終了しません:

#include <stdio.h> 
#include <string.h> 
#define MAX_LENGTH 100 
#define MAX_READ_CYCLES 100 

int main() { 
    int cycles = 0; 
    char foo[4]; 
    do { 
     char array[MAX_LENGTH + 1]; 

     printf("\n\nEnter a string: "); 

     char ch; 
     int i = 0; 
     while ((ch = getchar()) != '\n' && ch != EOF) { 
      array[i] = ch; 
      i++; 
     } 

     array[i] = '\0'; //string terminator 


     printf("String you entered: %s\n", array); 

     printf("\nDo you want to continue?"); 
     scanf("%s", foo); 

     cycles++; 

     while ((ch = getchar()) != '\n' && ch != EOF); // force drop stdin 

    } while (strcmp(foo, "yes") == 0 && cycles < MAX_READ_CYCLES); 
} 

I am not able to flush stdinhttp://c-faq.com/stdio/stdinflush2.html

+1

あなたは正しいです、1.問題は私のforループに起因していました。ありがとう – fbid

+0

@fbidあなたの他の問題の私の編集を参照してください – orestisf

+0

悪い、悪い、悪い! 'foo'を使用すると' scanf'にバッファオーバーフローが発生し、 'strcmp'にバッファオーバーランが発生する可能性があります。 –

0

あなたは3バイトの文字配列を作成し、それに3バイト以上を格納しています。それの終わりにヌルが付くことを忘れないでください。十分なスペースを確保していないので、他のメモリ位置を上書きしているため、常に未定義の動作が発生します。

ここでも、scanfは非常に危険です。それは、このような文字配列を初期化するためにも有効ではありません。char foo[3]="";

+0

あなたは 'foo [3]'配列については正しいですが、単純なテストケースを再現するための素早い例でした。とにかく整数変数int foo = 0を使用してwhile条件をwhile(foo == 1)に置き換えても問題は解決しません。 – fbid