在扫描复数计算器的数字之前扫描运算符会产生错误,但在数字之后扫描运算符时不会出现错误

Scanning operator before scanning the numbers for a complex number calculator gives an error but it doesn't when operator is scanned after numbers

以下是问题(大部分现已修复):

  1. 运算符的 scanf 位置在此特定代码中不重要,但显然在提示扫描数字后写入时它确实如此。
  2. 案例“/”每次都给出 0.00 作为输出,即使逻辑对我来说似乎是正确的。
  3. 在数字之前扫描运算符的目的是,如果用户选择的运算符与程序中硬连接的运算符不同,程序只会return一条错误消息,而不是让用户输入值数字,然后通过 switch case 获取错误消息。但我不知道该怎么做。

固定代码如下:

#include <stdio.h>

int main(){
typedef struct complex_numbers
{
    float real;
    float imag;
}complex;
complex c1, c2, sum_c, sub_c, pro_c, div_c;
printf("Enter the real part of the first complex number : ");
scanf("%f", &c1.real);
printf("Enter the imaginary part of the first complex number : i*");
scanf("%f", &c1.imag);
printf("Enter the real part of the second complex number : ");
scanf("%f", &c2.real);
printf("Enter the imaginary part of the second complex number : i*");
scanf("%f", &c2.imag);
printf("Numbers entered are: %.2f + i*%.2f & %.2f + i*%.2f\n", c1.real, c1.imag, c2.real, c2.imag);
char operator;
printf("Enter operator '+'||'-'||'*'||'/': ");
scanf(" %c", &operator);
switch (operator)
{
case '+':
sum_c.real= c1.real+ c2.real;
sum_c.imag= c1.imag+ c2.imag;
printf("Sum of the numbers is: %.2f + i*%.2f", sum_c.real, sum_c.imag);
break;
case '-':
sub_c.real= c1.real- c2.real;
sub_c.imag= c1.imag+ c2.imag;
printf("Difference of the numbers is: %.2f + i*%.2f", sub_c.real, sub_c.imag);
break;
case '*': 
pro_c.real= c1.real* c2.real+ (c1.imag* c2.imag)*(-1);
pro_c.imag= c1.real* c2.imag+ c1.imag* c2.real;
printf("Product of the numbers is: %.2f + i*%.2f", pro_c.real, pro_c.imag);
break;
case '/':
if((c2.real&& c2.imag)==0){
    printf("Error: Invalid denominator!");
    return 1;
}
div_c.real= (float)(c1.real* c2.real+ (-1)*(c1.imag* (-c2.imag)))/(c2.real* c2.real+ c2.imag* c2.imag);
div_c.imag= (float)(c1.real* (-c2.imag)+ c1.imag* c2.real)/(c2.real* c2.real+ c2.imag* c2.imag); 
printf("Division of the numbers is: %.3f + i*%.3f", div_c.real, div_c.imag);
break;
default:
printf("Error: Invalid operator!");
break;
}
return 0;
}

这是因为scanf("%c", &operator);会在读取前一个数字后读取输入中仍然存在的换行符(\n)。 %c 转换说明符是例外之一,因为它 而不是 跳过前导白色 space。这就是为什么首先读取运算符有效(输入中没有换行符),但在读取数字后读取它却不起作用的原因。

解决此问题的一种方法是在格式字符串中的 %c 之前添加一个 space 字符:

scanf(" %c", &operator);

有关 scanf 和格式字符串的确切规范,请参阅 here

要捕获这些类型的错误,您可能需要(暂时)打印读取的字符的整数值,以检查它是否符合您的预期。

一些补充建议:

  • 不使用任何参数的 main 函数的正确签名是 int main(void)
  • 打印除法结果的printf语句指定了浮点数,但是传递给它的变量是int类型的。前几行有转换,但结果值仍然存储在 ints.
  • 浮点复杂类型 exist in C99