C程序。开关语句/用户输入。默认情况下继续执行。

3

每次我输入正确的字符时,都会执行默认语句。我错过了什么吗?

我的输出:

我的输出

正确的输出:

正确的输出

#include <stdio.h>

void main() {
    char ch = '?'; 
    float f;
    double a = 10.00, b = 20.00;
    int i;
    for (i = 0; i < 10; i++) { 
        scanf("%c", &ch);

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

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

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

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

          default:
            printf("invalid operator\n");
       }
    }
    return 0;
}
4个回答

5
scanf() 函数在尝试解析除字符以外的内容之前会自动删除空白符号。字符格式(%c%[…]%n)是例外,不会删除空格。
在您的情况下,您需要跳过前导空格,为此,请更改原有代码。
scanf("%c", &ch);

为了

scanf(" %c", &ch);
       ^              Note the space

2

使用 scanf 函数,输入一个字符后需要按下 "enter" 键。这将向输入流中插入两个字符 - 你按下的字符和换行符 \n(可能还包括回车符 \r)。

举例来说,如果你输入 "a enter",那么输入流看起来像:

a\n

如果您输入"a b c d enter",那么输入流将如下所示:
abcd\n

你的循环的第一次迭代将读取你输入的字符,下一次将读取换行符(它不是你的case中的字符之一,因此会命中default语句)。
如果想要读取一个没有换行符的单个字符,请考虑使用getchar或者添加两个额外的case分支来捕获换行符和回车符,并在这两种情况下什么也不做(但要注意这将“窃取”你循环中的一些有用迭代)。

0

在编程中,当使用 %s 时,您不需要空格,但是您必须使用 scanf(" %c", &ch); 来消除所有的空格。


0

scanf("%c", &ch);语句需要你按下回车键。这会在输入流中插入换行符\n。当迭代从输入流中读取到\n字符时,将执行默认的switch-case。

由于只读取一个字符,因此可以考虑使用getchar来避免这种情况。或者,您可以在单行中输入字符串,然后按回车键,例如:+++---***+,或者添加另一个switch case来处理换行符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接