2013-11-22 2 views
2

я решала проблемы программирования на языке C, наткнулся в книгеНеожиданное поведение цикла do-while в C?

код был следующим: -

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    int num; 
    char another; 
    do 
    { 
      printf("Enter a Number"); 
      scanf("%d",&num); 
      printf("Square Of The Entered Number Is = %d",num*num); 
      printf("Do You Still Want To continue (y/n)"); 
      scanf("%c",&another); 

    }while(another=='y'); 

    getch(); 
} 

Теперь, когда я запустил эту программу в «TurboC++ MSDOSBox для Windows 7»

программа выходит даже если я введу «у» после того, как следующее заявление «Вы все еще хотите, чтобы продолжить (г/п)»

Похоже, он не выполняет никаких заявлений после этого один

, потому что я добавил еще одно заявление после того, как этот, как: -

scanf("%c",&another); 
printf("another is = %c",another); 

но ценность другого никогда не был напечатан. Программа выходила напрямую

ответ

4

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

Исправление very simple: Сообщите scanf, чтобы пропустить ведущие пробелы (включая новую строку) перед чтением вашего персонажа. Это делается путем добавления пробела перед кодом формата:

scanf(" %c",&another); 
/* ^ */ 
/*  |  */ 
/* Note space */ 

Когда вы вводите номер для первого scanf вызова, есть входной буфер, который будет выглядеть

 
+--+--+--+--+ 
| 1| 2| 3|\n| 
+--+--+--+--+ 

, если вы вводите номер 123. После того, как функция scanf считывает номер, буфер будет выглядеть

 
+--+ 
|\n| 
+--+ 

Другими словами, он содержит только символ новой строки. Теперь, когда вы делаете второй scanf, чтобы прочитать символ, функция scanf видит эту новую строку, и, поскольку она является символом, она счастлива и возвращает эту новую строку вам в переменной another.

Что добавляет пробел в строке формата scanf, заключается в том, чтобы сообщить scanf, чтобы пропустить любые пробелы, включая новую строку, возврат каретки, пробел и вкладку. Затем он найдет персонажа, которого вы действительно хотите ввести и прочитайте.

Кроме того, большинство спецификаторов формата автоматически пропускает ведущие пробелы, такие как спецификатор "%d". Но при сканировании символов это невозможно, так как вызывающий может на самом деле хочу символ новой строки.

+0

Может быть, вы могли бы также прокомментировать, почему * другой * никогда не печатается? (вероятно, буферизованная печать) –

+0

@ ring0 Возможно, это * * напечатан, но поскольку это новая строка (и у вас нет новой строки в строке формата), вы ее не заметите. При печати символов (или строки) может быть хорошей идеей создать их, например 'printf (« another is = '% c », другой);', тогда вы можете легко увидеть, есть ли что-то там. –

+0

Спасибо. , Это сработало Довольно хорошо, и после этого исправления пробелов другой был напечатан. но я не мог понять логику новой строки, –

0

Другой простой способ заключается в использовании функции, специально предназначенные для чтения символов

Заменить scanf("%c",&another); на another=getch(); или another=getchar()

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