getchar() не ждет ввода и сразу переходит к следующей строке

getchar() не ждет ввода и сразу переходит к следующей строке. Я думаю, что между scanf и getchar есть некоторое несоответствие, но я не могу понять, что именно.

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

int main()
{

char ch;
int n1,n2;

printf("Enter the operation of your choice\n");
printf("a. add\ts. subtact\nm. multiply\td. divide\nq. quit\n");

while((ch=getchar())!='q')
{
 printf("\nEnter 1st number:\n");
    if(scanf("%d",&n1)!=1)
    {
        printf("Please enter an integer value.\n");
        continue;
    }
       printf("Enter 2nd number:\n");
    if(scanf("%d",&n2)!=1)
    {
        printf("Please enter an integer value.\n");
        continue;
    }  

 switch(ch)
    {
        case 'a':
        { printf(" %d + %d = %d\n",n1,n2,n1+n2);
          break;  
        }

        case 's':
        {
            printf(" %d - %d = %d\n",n1,n2,n1-n2);
            break;
        }

        case 'm':
        {
            printf(" %d * %d = %d\n",n1,n2,n1*n2);
            break;
        }

         case 'd':
        {

            if(n2!=0)
            {
            printf(" %d / %d = %f\n",n1,n2,(float)n1/n2);
            break;
            }
            else
            {
                printf("Enter a non-zero number for n2\n");
                continue;
            }

            break;
        }

    }

 printf("Enter the operation of your choice\n");
 printf("a. add\ts. subtact\nm. multiply\td. divide\nq. quit\n");
  }
  printf("Bye.");
 }

ВЫХОД:

Введите операцию по вашему выбору

а. добавить с. вычесть

м. умножить д. делить

кв. покидать

a

Введите 1-й номер:

50

Введите 2-й номер:

25

50 + 25 = 75

Введите операцию по вашему выбору

а. добавить с. вычесть

м. умножить д. делить

кв. покидать

Введите 1-й номер:


person Aditya Sarin    schedule 08.04.2020    source источник
comment
getchar читает также пробелы. как, например, символ новой строки '\n', который соответствует введенной клавише Enter. Вместо этого используйте scanf(%c, &ch);   -  person Vlad from Moscow    schedule 09.04.2020
comment
Отвечает ли это на ваш вопрос? функция scanf getchar пропущена   -  person KamilCuk    schedule 09.04.2020


Ответы (1)


ваш getchar считывает новую строку и другие пробелы, которые вы вводите, когда вы даете значение, прочитанное scanf, вам нужно обойти эти пробелы

просто заменить

while((ch=getchar())!='q')

by

 while ((scanf(" %c", &ch) == 1) && (ch != 'q')) 

обратите внимание на пробел перед «%», благодаря ему пробелы, включая новую строку, обходят

person bruno    schedule 08.04.2020
comment
Спасибо, я так и сделаю - person Aditya Sarin; 09.04.2020