У вас есть две проблемы:
1. вы оставляете '\n'
во входном буфере после scanf_s("%d", &n1);
, который затем принимается как ваш ввод для scanf_s("%c", &mark, sizeof(mark));
Вы должны удалитьзавершающий перевод новой строки перед попыткой чтения с "%c"
.Подойдет простая функция empty_stdin
,
например,
#include <stdio.h>
void empty_stdin ()
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
...
printf("입력 : ");
scanf_s("%d", &n1);
empty_stdin(); /* remove all extraneous chars from stdin */
printf("choose function : ");
scanf_s("%c", &mark, sizeof(mark));
2. Вы не можете включить break
в конце каждого switch
случая, вызывающегоавтоматический переход к следующему switch
делу, вам нужно,
например
switch (mark)
{
case '+':
result = Calc(n1, n2, Plus);
break;
case '-':
result = Calc(n1, n2, Minus);
break;
}
Если положить его в целом, вы можете сделать:
#include <stdio.h>
void empty_stdin ()
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
int Calc(int n1, int n2, int(*func) (int n1, int n2))
{
return func(n1, n2);
}
int Plus(int n1, int n2)
{
return n1 + n2;
}
int Minus(int n1, int n2)
{
return n1 - n2;
}
int main(void)
{
int n1, n2;
int result = 0;
char mark;
printf("입력 : ");
scanf_s("%d", &n1);
empty_stdin();
printf("choose function : ");
scanf_s("%c", &mark, sizeof(mark));
printf("입력 : ");
scanf_s("%d", &n2);
switch (mark)
{
case '+':
result = Calc(n1, n2, Plus);
break;
case '-':
result = Calc(n1, n2, Minus);
break;
}
printf("%d\n", result);
return 0;
}
( ПРИМЕЧАНИЕ: Вы также должны проверить return каждого scanf
, чтобы убедиться, что у вас есть действительный ввод - это оставлено вам. Также обратите внимание, что вы можете игнорироватьведущий пробел - включая '\n'
- путем включения пробела перед указателем формата, например, " %c"
, но это не защищает от сбоя , соответствующего от вашего предыдущего ввода- в идеале вы должны empty_stdin()
следовать за каждым вводом с помощью scanf
, чтобы защитить от этого случая и подготовить буфер ввода для вашего следующего ввода.)
Пример использования / Вывод
$ ./bin/fnpointer
입력 : 2
choose function : +
입력 : 3
5