2013-06-22 2 views
0

Недавно я начал работать с языком программирования C примерно два или три дня назад, но я столкнулся с некоторыми проблемами при работе с циклом do-while. Это часть моей программы, которая не запускалась.Цикл Do-While в C

#include <stdio.h> 
#include <ctype.h> 
#include <stdbool.h> 

int main(void){   
    char another_game = 'Y'; 
    scanf("%c", &another_game); 
    do{ 
     printf("\nWould you like to continue(Y/N)?"); 
     scanf("%c", &another_game); 
    }while(toupper(another_game) == 'Y'); 
    return 0; 
} 

Петля предполагают, чтобы продолжать работать до тех пор, пока пользователь набирает 'Y' или 'y' когда приглашение сделать это, но я заметил, что после того, как программа выполняет цикл в первый раз, он просто отображает вопрос, а затем снова цикл прерывается. Я пробовал использовать целые числа, чтобы пользователь мог ввести 1, когда он хочет продолжить, или 0, когда он хочет выйти, это сработало, поэтому я не понимаю, почему этого не будет. Я был бы признателен за помощь в решении этой проблемы, спасибо

+1

'зсапЕ ("% с", ...)' не потребляет символ новой строки. Ваше подтверждение получает эту новую строку. Используйте 'scanf ("% c ", & another_game);', чтобы пропустить начальные пробелы. (это дубликат много раз, но я слишком ленив, чтобы искать. Все берутся?) –

+0

newline остается – BLUEPIXY

+1

Возможный дубликат [Simple C scanf не работает?] (http://stackoverflow.com/questions/3744776/simple -c-scanf-does-not-work) –

ответ

5

Потому что, когда вы нажимаете <enter>, в буфере stdin присутствует символ новой строки. Лучше использовать fgets() вместо:

char buf[0x10]; 
fgets(buf, sizeof(buf), stdin); 
if (toupper(buf[0]) == 'Y') { 
    // etc. 
} 
+0

Спасибо, что это сработало, но как я могу исключить прямую линию от scanf, я имею в виду, если есть способ ее устранения –

+0

@JamesOkpeGeorge Я думаю, что Даниил Комментарий Fischer суммирует его, но вы должны ** действительно избегать использования 'scanf()'. ** Его использование меньше, чем неинтуитивное, и очень легко получить его неправильно, особенно для новичка. Я тоже не использую его. Я боюсь. –

+0

:-), Спасибо всем –

2

Я хотел бы использовать GetChar, как это было бы более детерминированным для ваших целей. Также не забудьте добавить еще один getchar для проверки символа новой строки.

do { printf("enter Y/N\n"); } while(((toupper(getchar()) == 'Y') + (getchar() == '\n')) == 2);