c编程-为什么这个使用开关的简单计算器不';行不通

c编程-为什么这个使用开关的简单计算器不';行不通,c,switch-statement,C,Switch Statement,我试图弄明白为什么这些几乎完全相同的代码表现出不同的行为 第一个运行正常(此处,scanf运算符置于scanf操作数之前) #包括 int main(){ 字符算子; 双第一,第二; printf(“输入运算符(+、-、*):”; scanf(“%c”、&运算符); printf(“输入两个操作数:”); scanf(“%lf%lf”、&first和&second); 开关(操作员){ 格“+”: printf(“%.1lf+%.1lf=%.1lf”,第一、第二、第一+第二); 打破 案例'-'

我试图弄明白为什么这些几乎完全相同的代码表现出不同的行为

第一个运行正常(此处,scanf运算符置于scanf操作数之前)

#包括
int main(){
字符算子;
双第一,第二;
printf(“输入运算符(+、-、*):”;
scanf(“%c”、&运算符);
printf(“输入两个操作数:”);
scanf(“%lf%lf”、&first和&second);
开关(操作员){
格“+”:
printf(“%.1lf+%.1lf=%.1lf”,第一、第二、第一+第二);
打破
案例'-':
printf(“%.1lf-%.1lf=%.1lf”,第一、第二、第一-第二);
打破
案例“*”:
printf(“%.1lf*%.1lf=%.1lf”,第一、第二、第一*第二);
打破
案例“/”:
printf(“%.1lf/%.1lf=%.1lf”,第一、第二、第一/第二);
打破
//运算符不匹配任何大小写常量
违约:
printf(“错误!运算符不正确”);
}
返回0;
}
现在,第二个没有(这里scanf操作数放在scanf操作符之前)

#包括
int main(){
字符算子;
双第一,第二;
printf(“输入两个操作数:”);
scanf(“%lf%lf”、&first和&second);
printf(“输入运算符(+、-、*):”;
scanf(“%c”、&运算符);
开关(操作员){
格“+”:
printf(“%.1lf+%.1lf=%.1lf”,第一、第二、第一+第二);
打破
案例'-':
printf(“%.1lf-%.1lf=%.1lf”,第一、第二、第一-第二);
打破
案例“*”:
printf(“%.1lf*%.1lf=%.1lf”,第一、第二、第一*第二);
打破
案例“/”:
printf(“%.1lf/%.1lf=%.1lf”,第一、第二、第一/第二);
打破
//运算符不匹配任何大小写常量
违约:
printf(“错误!运算符不正确”);
}
返回0;
}

当您键入两个数字时,您输入:

3.141 2.71828\n
注意末尾的换行符。换行符不是双精度(
%lf
)的一部分,因此它没有从输入缓冲区读取到第二个
中。相反,换行符(
\n
)保留在输入缓冲区中

下一个
scanf
用于字符(
%c
)。它得到了哪个角色?它得到了新线

因此,变量
操作数
中包含字符
\n

要修复此问题,请进行扫描:

scanf("%lf %lf ", &first, &second);
scanf("%c ", &operator);   // Note the extra space at the end of each format-string

这与
switch
语句无关。
scanf(“%c”和&operator)
(注意添加的
空间
)感谢您添加的空间使其正常工作。我想知道为什么这是必要的,取决于scanf的放置顺序…说明符后面的空格有问题。。。空格扫描所有空格,直到遇到非空格。问题是,
“%c”
将一直执行,直到您按任何其他键,然后再按一个空格,因为
scanf
将等待任何其他键,然后再按一个空格,并且由于行被缓冲,您还必须按enter键。简而言之,最好在
%c
%c”
前面加一个空格,让它只读取已缓冲的换行符。很高兴知道并感谢您帮助我理解这一点,但我仍然不明白为什么这个额外的空格取决于scanf的放置顺序。
3.141 2.71828\n
scanf("%lf %lf ", &first, &second);
scanf("%c ", &operator);   // Note the extra space at the end of each format-string