2010-01-06 2 views
0

Как я могу использовать getchar() в цикле? Теперь у меня есть ...C - 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 прыгает первым петля

+0

заменять вызовы fflush (stdin) и getchar(). Да, fflush (stdin) технически неопределен, но он делает правильную вещь как в ms-cl, так и в gcc –

+0

не работает :( – genesisxyz

+1

Что «не работает»? Какое поведение вы видите и чего вы ожидаете? в виду, что getchar() может ничего не обработать до тех пор, пока вы не нажмете клавишу ввода. Если n_players равно 3, цикл будет выполняться 2 раза. – nos

ответ

7

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

+0

Я размещаю полный код в 'for' – genesisxyz

+0

. Чем конкретнее вы, тем больше людей будет склонен вам помочь. –

4

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

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

2

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

Что-то вроде этого:

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

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

Е «\ п»

(это означает, что он/она нажимает символ Е с последующим ENTER)

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

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

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

+0

c = getchar(); getchar(); В первом цикле это нормально ...но на втором я должен нажать дважды кнопку :( – genesisxyz

+0

имейте в виду, что для того, чтобы сделать работу getchar так, как вы хотите, вы должны нажать письмо, прежде чем нажать Enter. Просто нажатие ENTER не будет работать с этим трюком. –

2

1] fflush's on input stream - неопределенное поведение.

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

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