2014-12-28 2 views
-1

Мой код:Простой в то время как петля

#include <stdio.h> 
int main(void){ 
char input; 
    while(1){ 
     printf("Repeat? [Y/N] "); 
     scanf("%c", &input); 
     if(input=='N' || input=='n'){ 
      break; 
     } 
    } 
    return 0; 
} 

Ожидаемый результат:

Repeat? [Y/N] y 

Repeat? [Y/N] y 

Repeat? [Y/N] n //Program terminated 

Выход:

Repeat? [Y/N] Repeat? [Y/N] y 

Repeat? [Y/N] Repeat? [Y/N] y 

Repeat? [Y/N] Repeat? [Y/N] n //Program terminated 
+1

... и проверить возвращаемое значение для 'scanf' –

+0

NB: идиоматические Некоммерческие -терминирующий цикл в C является 'for (;;)', поскольку он избегает булевых выражений с постоянным значением в 'while (1)', на которые жалуются некоторые lints. – Jens

ответ

1

Изменить

scanf("%c", &input); 

в

scanf(" %c", &input); //Note the space before %c 

При вводе символа, когда программа попросит вас, вы вводите символ и нажмите Enter ключ (\n). scanf считывает символ, который вы ввели, и оставляет символ новой строки (\n) во входном потоке (stdin). В результате в следующий раз вызывается scanf, он видит \n, присутствующий в stdin, и поскольку он также является символом, scanf потребляет его и, как результат, не ждет ввода.

Пространство перед %c инструктирует scanf пропустить все пробелы, такие как новые строки и пробелы, прежде чем читать символ.

4

scanf читает \n символ слева сзади (по нажатию Введите ключ) во входном буфере. Просто замените ваш scanf с

scanf(" %c", &input); 
//  ^A space before %c can skip any number of white-spaces 
1

при нажатии Enter после взятия y/n, вы также берете символ Enter. По этой причине вы получите Repeat? [Y/N] Repeat? [Y/N]

вы код хорошо, если вы можете добавить только строку getchar(); как :::

int main(void){ 
char input; 
    while(1){ 
     printf("Repeat? [Y/N] "); 
     scanf("%c", &input); 
     if(input=='N' || input=='n'){ 
      break; 
     } 
     getchar(); // for taking enter 
    } 
    return 0; 
} 
Смежные вопросы