2

对不起,如果这听起来像一个非常基本的问题,这是我第一次来这里!

我在为 C 编码时遇到了一些困难,特别是使用开关和该开关的默认值。这是一些示例代码:

#include<stdio.h>

int key;
main()
{
while((key=getchar())!=EOF)
{
printf("you pressed %c \n",key);
    switch(key){
case'0':
case'1':
case'2':
case'3':
   printf("it's a numeral\n");
   break;
default:
   printf("it's not a numeral\n");
  } 
 }
}

实际代码要长一些,这纯粹是一个例子。

所以代码编译它并执行它,但我得到:

“你按 1,它是一个数字,你按 ,它不是一个数字。”

我的代码似乎“失败”并在不提及任何一个的情况下重复自身。如果有人可以提供帮助,那就太好了,因为这是教科书中的一个例子,我完全被困住了!

最亲切的问候。

4

5 回答 5

1

您需要吃掉换行符,当您点击时将其放入读取缓冲区return

在切换之后或之前发出另一个呼叫以getchar解决您的问题。

于 2012-05-20T22:03:12.670 回答
1

您需要考虑输入 Enter 键,它会在 *nix 系统上生成一个 '\n'。我不确定在 Windows 系统上按 Enter 键有什么作用。

这是您修改后的原始代码以吃回车键。

#include<stdio.h>

int key = 0;
main()
{
    while((key=getchar())!=EOF)
    {
        if('\n' == key)
        {
            /* Be silent on linefeeds */
            continue;
        }

        printf("you pressed %c \n",key);
            switch(key){
        case'0':
        case'1':
        case'2':
        case'3':
           printf("it's a numeral\n");
           break;

        default:
           printf("it's not a numeral\n");
      } 
     }
}

您可能getchar()出于特定原因使用,但我在 C 语言中的经验通常涉及阅读整行,而 RTL 函数之类scanf的会为您吃掉行终止符。

于 2012-05-20T22:16:54.680 回答
0

这是一个想法...紧接在printf(), 之前插入逻辑以忽略空格和所有控制字符...

if(key <= ' ')
  continue;
printf(...) ...
于 2012-05-20T22:03:47.873 回答
-1

我不知道这是否是问题,但你有三个案例没有休息。所以你按下“1”键,程序就没有什么可做的了,所以进入下一个案例,这是正确的,这是默认的。虽然你在一个 int 变量中取了一个 char ???

在您的示例中,采用这样的 if 子句是一种更好的方法:

#include<stdio.h>

char key;
main()
{
while((key=getchar())!=EOF)
{
printf("you pressed %c \n",key);
   if(key == '0' || key == '1' || key == '2' || key == '3'){
      printf("it's a numeral\n");
   }
   else {
      printf("it's not a numeral\n");
   }
}

代码未经测试。;-)

大型程序中最好的方法是使用正则表达式。

我希望,这个答案是有帮助的。

于 2012-05-20T22:16:29.787 回答
-1
  • 问题可能是由于输入缓冲区未刷新。当在 switch case 中匹配“1”时,缓冲区中会保留一个换行符。
  • 尝试这个,
     fflush(stdin)
于 2012-05-20T22:27:19.530 回答