Почему регистр по умолчанию совпадает в этом операторе switch? - PullRequest
2 голосов
/ 29 марта 2020

У меня вопрос по поводу switch заявлений. Вот мой код:

#include<stdio.h>
int main()
{
  float a=0.0f;
  float b=0.0f;
  char operation=0;

  printf("Enter expression:");
  scanf("%f %c %f",&a,&operation,&b);

    switch(operation)
    {
      case '+':
      printf("=%.2f\n",a+b);
      break;

      case '-':
      printf("=%.2f\n",a-b);
      break;

      case '*':
      printf("=%.2f\n",a*b);
      break;

      case '/':
      if(b==0)
      printf("\ndivision by zero error.\n");
      else
      printf("=%.2f\n",a/b);
      break;

      case '%':
      if(b==0)
      printf("\ndivision by zero error.\n");
      else
      printf("=%d\n",(int)a%(int)b);
      break;

      default:
      printf("invalid operation\n");
      break;
    }
    return 0;
}

И это результат двух разных вводов, один правильный, другой неправильный.

my output

Почему, когда я вводю две буквы вместо двух цифр, это go в случае default?

Ответы [ 3 ]

3 голосов
/ 29 марта 2020

a+b не будет соответствовать строке формата вашего scanf, так как он ожидает плавающие символы, а не символы (например, a или b), поэтому scanf ничего не делает.

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

И поскольку operation инициализирован в 0, будет выполнен регистр по умолчанию.

2 голосов
/ 29 марта 2020

scanf("%f %c %f",&a, &operation, &b);

Итак, когда вы вводите a + b :

  1. 'a' не является float

  2. scanf не удается (вы можете проверить это по его возвращаемому значению)

  3. operation все еще с его значение по умолчанию 0

Внутри оператора switch ни один из случаев ('+', '-', '*', '/', '%') получить соответствие, потому что char operation = 0;

Следовательно, выполняется блок по умолчанию.

1 голос
/ 29 марта 2020

Потому что вам нужно проверить возвращаемое значение scanf

// scanf("%f %c%f", &a, &operation, &b);
if (scanf("%f %c%f", &a, &operation, &b) != 3) {
    fprintf(stderr, "Unable to convert input!\n");
    exit(EXIT_FAILURE);
}
...