C - getchar () в цикле? - PullRequest
       36

C - getchar () в цикле?

0 голосов
/ 06 января 2010

Как я могу использовать 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 ]

7 голосов
/ 06 января 2010

Во-первых, результат очистки входного потока не определен. Во-вторых, «не работает» не дает нам много чего сделать.

4 голосов
/ 06 января 2010
Поведение

fflush не определено для входного потока, поэтому представленный код не имеет смысла.

Этот цикл действительно произойдет 3 раза, если n_players равен 3.

2 голосов
/ 06 января 2010

1] fflush во входном потоке - неопределенное поведение.

2] Ваш цикл действительно выполняется 3 раза. Второй вызов getchar () будет использовать ключ ENTER из потока, который был помещен туда при первом вводе. Следовательно, вы думаете, что его вызывают только два раза.

Вкратце, поместите еще один getchar (), чтобы использовать \n. Это решит вашу проблему.

2 голосов
/ 06 января 2010

getchar() не очень хорошая опция для обработки ввода пользователя. Сказав, что, если вы все еще хотите использовать эту функцию, вы можете попробовать, не используя fflush и накапливая два вызова getchar:

Примерно так:

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

С getchar() дело в том, что он возвращает следующий символ, доступный в буфере клавиатуры. Итак, если вы делаете c = getchar(), а пользователь делает:

E '\ п'

(что означает, что он / она нажимает символ E, а затем ENTER)

c будет содержать значение 'E', а следующий вызов getchar() будет использовать ENTER ('\ n'), нажатый пользователем.

Итак, как вы можете видеть, это довольно сложно и трудно правильно контролировать.

Если это для тестирования некоторого кода, хорошо. Если это для реального приложения, попробуйте использовать зависимые от платформы библиотеки для пользовательского ввода (Win32 в Windows, GTK в Linux, ncurser в Linux и т. Д.)

...