2014-10-03 3 views
0

Я создаю программу для генерации следующего простого числа, для чего мне нужно взять пользовательский ввод. Я использую цикл do-while, но он не останавливается, чтобы принимать входные данные для второй раз. Пожалуйста, направляйте меня, где я делаю неправильно. Благодаря! Это мой фрагмент кодаПринимая входные данные от пользователя, используя цикл while в c

int 
main() 
{ 
int val=1; 
char input; 
do 
{ 
    val=nextprime(val); 
    printf("\n%d\t",val); 

    printf("Next Prime number? Y or N "); 
    scanf("%c",&input); 
} 
while(input != 'N' && input != 'n'); 
return 0; 

}

выход я получаю:

2 Next Prime number? Y or N y 

3 Next Prime number? Y or N 
5 Next Prime number? Y or N y 

7 Next Prime number? Y or N 
11 Next Prime number? Y or N y 

13 Next Prime number? Y or N 
17 Next Prime number? Y or N y 

19 Next Prime number? Y or N 
23 Next Prime number? Y or N y 

29 Next Prime number? Y or N 
31 Next Prime number? Y or N n 
+2

Попробуйте ''% c "' для вашей строки формата. См. Второй ответ на [** этот вопрос **] (http://stackoverflow.com/questions/3744776/simple-c-scanf-does-not-work). На этом есть много дубликатов; это был первый, с которым я столкнулся. – WhozCraig

ответ

0

У вас есть ответ здесь: Reading a single character in C

При нажатии кнопки «Y» нажатии клавиши ввода, которые стоят во входном буфере, и читается на следующей итерации вашего цикла.

Вы должны использовать:

scanf(" %c",&input); 

С ведущим пространством игнорировать последний caracters во входном буфере.

+0

Спасибо .. это действительно помогло. – bhavi

1

STDIN будет содержать y\n (у с ​​последующим возвратом каретки). Так как ваш код обрабатывает любой символ, отличный от N, или n как да, он вычисляет 2 новых простых числа, если вы вводите y, а затем возврат каретки.

Чтобы пропустить пропуски при чтении одного полукокса, поставить пробел перед кодом сканирования:

scanf(" %c",&input); 
+0

thanks..its working now .. – bhavi

1

Добавить пробел перед %c в scanf будет решить эту проблему.

Это делается потому, что scanf не потребляет \n символа после ввода первого символа и оставляет его в stdin .Каке клавиш ввода (\n) также характер, он получает потребляется следующим scanf вызовом и, таким образом, , ваш цикл снова будет выполнен. Пространство перед %c будет отбрасывать все пробелы, такие как пробелы.

Альтернативный способ преодолеть это было бы добавить getchar(); после scanf, чтобы съесть \n, но я предпочитаю первый.

+1

Я также предпочитаю первый, потому что он имеет более последовательное поведение, если пользователь вводит сразу несколько символов. –

+0

спасибо .. это сработало !! – bhavi

Смежные вопросы