Почему scanf ведет себя странно для ввода символов? - PullRequest
0 голосов
/ 18 августа 2011
/* Write macro for the following : 

1. Arithmetic Mean of two no.
2. Absolute value of a no.
3. To convert a Uppercase letter to lower case.
4. To obtain bigger of two numbers.

*/

#include<stdio.h>

#define am(a,b) ((a+b)/2)
#define abs(a) (a>=0?a:-a)
#define ul(ch) (ch>=65 && ch<=96 ? ch+32 : ch)
#define bigger(a,b) (a>=b?a:b)

int main () {

    int x,y;
    char c;

    printf("\nEnter two numbers:");
            scanf("%d%d",&x,&y);

    printf("\nThe arithmetic mean of two numbers is %f",(float)am(x,y));

    printf("\nEnter the number:");
            scanf("%d",&x);

    printf("\nThe absolute value of the number is %d",abs(x));

    printf("\nEnter the character:");
            scanf("%c",&c);

    printf("\nThe letter in lower case  is %c",ul(c));

    printf("\nEnter two numbers:");
            scanf("%d%d",&x,&y);

    printf("\nThe bigger of two numbers is %d",bigger(x,y));


 return 0;

 }

Все работает нормально, за исключением того, что программа не останавливается для ввода символов.

Вот снимок вывода ....

  Enter two numbers:4
  5
  The arithmetic mean of two numbers is 4.000000

  Enter the number:-7   **/*After hitting enter here it reaches line no. 7 */** 
  The absolute value of the number is 7

  Enter the character:                                          
  The letter in lower case  is  

  Enter two numbers:4   **/*line no. 7*/**
  6

  The bigger of two numbers is 6

Ответы [ 5 ]

3 голосов
/ 18 августа 2011

Это потому, что% d пропускает пробел, но% c нет - или другими словами.

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

измените ваш scanf, чтобы он пропускал пробелы, просто вставляя пробел перед% c, поэтому

   scanf(" %c",&c);
1 голос
/ 18 августа 2011

Я полагаю, что проблема здесь в том, что ваш scanf ("% c", & c) захватывает возврат каретки, введенный, когда вы нажимаете enter, чтобы вставить -7.

Положите getchar (или другой scanf("% c", & c)) прямо перед scanf, и у вас не должно быть этой проблемы.

1 голос
/ 18 августа 2011

% c читает любой символ, включая whitescape, поэтому он «съест» символ новой строки.

Использование: scanf(" %c",&c);

0 голосов
/ 18 августа 2011

Распространенная проблема с scanf - он не использует символ новой строки, вызванный нажатием Enter.Я обычно обхожу это, используя следующий макрос после вызова scanf

#define consumeBuffer() while (getchar() != '\n');

Конечно, это не всегда то, что вы хотите, но в большинстве случаев это сработает.

0 голосов
/ 18 августа 2011

Это потому, что после вашей первой scanf клавиша enter все еще находится в буфере ввода, а следующая scanf сохранит значение enter в x.Затем ваш следующий printf напечатает его - фактически перейдя на новую строку.

Чтобы это исправить, вы можете просто добавить вызов getchar() после каждого scanf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...