在扫描复数计算器的数字之前扫描运算符会产生错误,但在数字之后扫描运算符时不会出现错误
Scanning operator before scanning the numbers for a complex number calculator gives an error but it doesn't when operator is scanned after numbers
以下是问题(大部分现已修复):
- 运算符的 scanf 位置在此特定代码中不重要,但显然在提示扫描数字后写入时它确实如此。
- 案例“/”每次都给出 0.00 作为输出,即使逻辑对我来说似乎是正确的。
- 在数字之前扫描运算符的目的是,如果用户选择的运算符与程序中硬连接的运算符不同,程序只会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
类型的。前几行有转换,但结果值仍然存储在 int
s.
- 浮点复杂类型 exist in C99。
以下是问题(大部分现已修复):
- 运算符的 scanf 位置在此特定代码中不重要,但显然在提示扫描数字后写入时它确实如此。
- 案例“/”每次都给出 0.00 作为输出,即使逻辑对我来说似乎是正确的。
- 在数字之前扫描运算符的目的是,如果用户选择的运算符与程序中硬连接的运算符不同,程序只会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
类型的。前几行有转换,但结果值仍然存储在int
s. - 浮点复杂类型 exist in C99。