【问题标题】:Switch and default: for C开关和默认值:对于 C
【发布时间】:2012-05-20 21:59:50
【问题描述】:

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

我在为 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,是数字,你按了,不是数字。”

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

最诚挚的问候。

【问题讨论】:

标签: c switch-statement default-value


【解决方案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 语言中的经验通常涉及读取整行,而像 scanf 这样的 RTL 函数会为您吃掉行终止符。

【讨论】:

  • 在 Windows 上它也会生成 \n,除非您正在读取以二进制模式打开的文本文件。
  • @MatteoItalia 谢谢。我不再做很多命令行读取了。主要是输入文件。
  • @octopusgrabbus 非常感谢您的帮助。它现在就像一个魅力!就这样我完全理解它,我基本上包括一个'if'语句来测试'/n'是否等于我的变量,如果它是......继续而不显示任何东西?如果我错了,请告诉我,因为我真的很想在继续之前对此有一个坚定的理解!再次感谢!
  • @Chalk 根据你最终在 C 中所做的工作类型,你可能会发现你会更多地依赖 scanf() 而不是 getchar(),尽管 getchar() 对于快速输入很有用只有一个字符。
  • @octopusgrabbus 我只是将它用作其他语言的学习曲线。我不得不说,我喜欢 C 的简单性!澄清一下,如果您的解决方案在我之前的评论中是正确的,我的理解是正确的。再次感谢您的帮助。
【解决方案2】:

你需要吃掉换行符,当你点击return时,它被放入读取缓冲区。

在切换之后或之前再次调用getchar 来解决您的问题。

【讨论】:

    【解决方案3】:

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

    if(key <= ' ')
      continue;
    printf(...) ...
    

    【讨论】:

      【解决方案4】:

      我不知道这是否是问题,但你有三个案例没有休息。因此,您按下键“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");
         }
      }
      

      代码未经测试。 ;-)

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

      希望这个回答对你有帮助。

      【讨论】:

      • 这段代码的行为与OP相同;在什么方面更好?
      • @ScottHunter:相反,我在那个答案中看到了很多问题。一个简单的通用处理的多个空案例比编写一个臃肿的 if 条件要简单得多,并且是使用 switch 的方法。而关于一般无条件使用正则表达式的建议是金锤综合症的症状。
      【解决方案5】:
      • 问题可能是由于输入缓冲区未刷新。当在 switch case 中匹配“1”时,缓冲区中会保留一个换行符。
      • 试试这个,
         fflush(stdin)

      【讨论】:

        猜你喜欢
        • 2021-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        相关资源
        最近更新 更多