开关和默认值:对于C

开关和默认值:对于C,c,switch-statement,default-value,C,Switch Statement,Default Value,对不起,如果这听起来像是一个非常基本的问题,这是我第一次在这里 我在为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

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

我在为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");
  } 
 }
}
#包括
int键;
main()
{
while((key=getchar())!=EOF)
{
printf(“您按了%c\n”,键);
开关(钥匙){
案例'0':
案例'1':
案例'2':
案例'3':
printf(“它是一个数字”);
打破
违约:
printf(“它不是数字”);
} 
}
}
实际代码要长一些,这纯粹是一个示例

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

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

我的代码似乎“失败”了,并且在没有引用任何一个的情况下重复它自己。如果有人能帮忙,那就太好了,因为这是一本教科书中的一个例子,我完全被卡住了


最亲切的问候。

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


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

您需要使用换行符,当您点击
return
时,该换行符会被放入读取缓冲区


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

这里有一个想法…在
printf()之前插入忽略空格和所有控制字符的逻辑

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

如果(键这里有一个想法…就在
printf()之前插入逻辑忽略空格和所有控制字符

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

if(key我不知道这是否是问题所在,但您有三个案例没有中断。因此,您按“1”键,程序无需执行,因此ins转到下一个案例如何正确,这是默认情况。
虽然在int变量中使用字符

在您的示例中,采用如下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");
   }
}
#包括
字符键;
main()
{
while((key=getchar())!=EOF)
{
printf(“您按了%c\n”,键);
如果(键='0'| |键=='1'| |键=='2'| |键=='3'){
printf(“它是一个数字”);
}
否则{
printf(“它不是数字”);
}
}
代码未经测试。;-)

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


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

我不知道这是否是问题所在,但您有三个案例没有中断。因此,您按“1”键,程序无需执行,因此ins转到下一个案例如何正确,这是默认情况。 虽然在int变量中使用字符

在您的示例中,采用如下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");
   }
}
#包括
字符键;
main()
{
while((key=getchar())!=EOF)
{
printf(“您按了%c\n”,键);
如果(键='0'| |键=='1'| |键=='2'| |键=='3'){
printf(“它是一个数字”);
}
否则{
printf(“它不是数字”);
}
}
代码未经测试。;-)

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


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

您需要说明输入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");
      } 
     }
}
#包括
int键=0;
main()
{
while((key=getchar())!=EOF)
{
如果('\n'==键)
{
/*对换行保持沉默*/
持续
}
printf(“您按了%c\n”,键);
开关(钥匙){
案例'0':
案例'1':
案例'2':
案例'3':
printf(“它是一个数字”);
打破
违约:
printf(“它不是数字”);
} 
}
}

您可以使用
getchar()
有一个特定的原因,但我在C语言中的经验通常涉及到读取整行,而像
scanf
这样的RTL函数将为您吃掉行终止符。

您需要考虑输入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");
      } 
     }
}
#包括
int键=0;
main()
{
while((key=getchar())!=EOF)
{
如果('\n'==键)
{
/*对换行保持沉默*/
持续
}
printf(“您按了%c\n”,键);
开关(钥匙){
案例'0':
案例'1':
案例'2':
案例'3':
printf(“它是一个数字”);
打破
违约:
printf(“它不是数字”);
} 
}
}
您可能出于特定的原因使用了
getchar()
,但我在C语言中的经验通常涉及到读取整行代码,而像
scanf
这样的RTL函数将为您吃掉行终止符。

  • 问题可能是由于输入缓冲区未刷新。当在开关情况下匹配“1”时,缓冲区中仍保留一个换行符
  • 试试这个,
     fflush(stdin)
    
    fflush(标准输入法)
      • 问题可能是由于输入缓冲区未刷新。当在开关情况下匹配“1”时,缓冲区中仍保留一个换行符
      • 试试这个,
         fflush(stdin)
        
        fflush(标准输入法)

      你没有吃
      return
      键。可能重复的你没有吃
      return
      键。此代码行为的可能重复与OP相同;以什么方式更好?@ScottHunter:相反,我在这个答案中看到了许多问题。对于一个简单的通用处理,多个空的情况比t对膨胀的if条件进行编码,这是使用
      开关的方法。关于正则表达式的一般无条件使用的建议是金锤综合征的一个症状。该代码的行为与OP相同;以什么方式更好?@ScottHunter:相反,我在这方面看到了许多问题