0

ループで getchar() を使用するにはどうすればよいですか? 今私が持っています...

for (p=0; p<n_players; p++) {
    ...
    fflush(stdin);
    getchar();
}

でもうまくいかない… n_players が 3 だと最後にだけ getchar を 2 回実行する…

for (p=0; p<n_players; p++) {
    blank_start();
    ascii_art_title();
    printf("%s, tocca a te...\n",player_info[p].player_name);
    srand(time(NULL));
    random_speed = MIN_WHEEL_SPEED + rand()%MAX_WHEEL_SPEED;
    move_wheel_pointer(random_speed, &pointer);
    if (player_points(&wheel[pointer]) == 0){
        player_info[p].points = wheel[pointer];
    }
    else {
        player_info[p].points = 0;
    }
    printf("\nGuadagni %d punti...\n",player_info[p].points);
    if (p<(n_players-1)) {
        printf("\nOra tocca a te, giocatore %d\n",(p+2));
    }
    fflush(stdin);
    getchar();
}

getchar は最初のループをジャンプします

4

4 に答える 4

7

まず、入力ストリームをフラッシュした結果は未定義です。第二に、「うまくいかない」からといって、先に進むことはあまりありません。

于 2010-01-06T17:16:53.817 に答える
4

fflushの動作は入力ストリームで定義されていないため、提示されたコードは無意味です。

n_players が 3 の場合、そのループは実際に 3 回発生します。

于 2010-01-06T17:17:12.217 に答える
2

getchar()ユーザー入力を処理するための適切なオプションではありません。そうは言っても、それでもその関数を使用したい場合は、使用せずfflushに2つの呼び出しを重ねることで試すことができますgetchar

このようなもの:

for (p=0; p<n_players; p++) {
   ...
   c = getchar(); // c will hold character read
   getchar(); // will consume '\n'
}

getchar()問題は、キーボード バッファーで使用可能な次の文字を返すことです。したがって、あなたが ac = getchar()を実行し、ユーザーが実行した場合:

E'\n'

(つまり、文字 E を押してから ENTER を押します)

cは値 'E' を保持し、次の呼び出しでgetchar()ユーザーが押した ENTER ('\n') を消費します。

ご覧のとおり、かなりトリッキーで、適切に制御するのは困難です。

コードのテスト用であればOKです。実際のアプリケーションの場合は、プラットフォームに依存するライブラリを使用してユーザー入力を行ってみてください (Windows では Win32、Linux では GTK、Linux では ncurser など)。

于 2010-01-06T17:26:12.957 に答える
2

1] 入力ストリームでの fflush の動作は未定義です。

2]ループは実際に3回実行されます。getchar() への 2 回目の呼び出しはENTER、最初に入力が行われたときにそこに置かれたストリームからキーを消費します。したがって、2回しか呼び出されないと思います。

つまり、.getchar() をもう 1 つ追加して、\n. それはあなたの問題を解決します。

于 2010-01-06T17:27:10.187 に答える