2017-08-27 55 views
3

每次输入正确的字符输入时都会执行默认语句。我错过了什么?C程序。切换大小写/用户输入。默认继续执行

我的输出:

My Outputs

正确的输出:

Correct Outputs

#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; 
} 

回答

2

随着scanf,你打一个键,那么你需要点击 “进入” 之后。这会在输入流中插入两个字符 - 您按下的字符,以及换行符\n(可能还有\r,回车符)。

出于演示,如果输入“一进”,则输入流的样子

a\n 

如果输入“ABCD输入”,然后输入流的样子:

abcd\n 

的您的循环的第一次迭代将读取您输入的字符,下一个将读取换行符(这不是您的case中的那些字符,因此命中了default语句)

要阅读没有换行符的单个字符,请考虑getchar,或者只是两个额外的case s,它们会使换行符和回车符在任何情况下都不起作用(但要记住这会“偷走”一些有用的迭代你的循环)。

0

您必须使用scanf(" %c", &ch);来消除所有空白,当使用%s强硬时,您不需要空间。

5

scanf()函数在尝试解析除字符之外的其他东西之前自动删除空格。

字符格式(%c,%[…],%n)是例外,它们不会删除空格。

你的情况,你要跳过前导白间距,这样做改变

scanf("%c", &ch); 

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

变化

scanf("%c", &ch);

ch=getche();

然后,它会正常工作,您将不必在每次输入后按Enter键。

0

scanf("%c", &ch);声明要求您按Enter键。这会在输入流中插入newline \n字符。在迭代过程中,当从输入流中读取\ n字符时,默认开关事件被执行。

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