【问题标题】:Switch - default not working in C开关 - 默认在 C 中不工作
【发布时间】:2014-12-26 12:25:32
【问题描述】:

我是新来的,我也是 C 语言的新手。尽管有默认值,但我的开关确实有问题。我有一个选项从 1 到 5 以及 0 的菜单。问题是,当我运行程序并引入任何多于 1 位的数字时,程序只读取第一个数字并执行相应的选项。 例如,如果我引入 13,程序将打开第 1 个选项,如果我引入 243,程序将打开第二个选项,依此类推。如果我引入数字和字母的组合,例如 1d、4b、5A 等,也会发生同样的情况。

你能帮帮我吗?

int main()  
{
  char opcao, terminar=1; /*Zona de declaração das variáveis*/
  MODULO mlunar;
  MODULO *maux=NULL;
  PONTOS *ponto=NULL, *p1=NULL;

  do
  {         
    printf("\n1 - Especificação dos dados do módulo e das condições iniciais do voo  \n");
    printf("2 - Simulalção do voo em modo de cockpit \n");
    printf("3 - Apresentação em modo gráfico da trajectória do módulo \n");
    printf("4 - Definição do perfil da superfície lunar \n");                      /*Imprime as opções no ecrã*/
    printf("5 - Simulação do voo em modo gráfico \n");
    printf("0 - Terminar o programa \n");
    printf("\nEscolha uma das opções acima indicadas, carregando no respetivo numero: ");

    opcao=getchar(); /*Leitura da opção seleccionada*/      
    while(getchar()!='\n'){}; /*Limpar o buffer do teclado*/

    switch(opcao)  /*Condição para cada opção selecionada*/   
    {
      case '1': /*Caso o utilizador carregue em '1', é invocada a função da 1ª opção e assim sucessivamente.*/
        maux=opcao1(&mlunar); break; 
      case '2':
        if(maux!=NULL)
        {
          opcao2(&mlunar); 
        }
        else
        {
          printf("\n\nOpção 1 NÃO EXECUTADA! Por favor, execute a primeira opção.\n");break;
        }
      case '3': 
        opcao3(mlunar); break;
      case '4': 
        p1=opcao4(ponto); break;
      case '5': 
        opcao5(p1); break;
      case '0':
        printf("\nDeseja terminar o programa? \n S/s - sim \n N/n - não \n");
        terminar=getchar(); /*Leitura da opção seleccionada*/       
        while(getchar()!='\n'){}; /*Limpar o buffer do teclado*/
        while (terminar!='s' && terminar!='S' && terminar!='n' && terminar!='N') /*O utilizador não inseriu nenhuma das opções apresentadas*/
        {
          printf("\nA opção selecionada é inválida! Por favor, introduza uma opção válida.\n");
          terminar=getchar();       
          while (getchar()!='\n'){}
        }
      default:
        printf("\nA opção selecionada não existe! Por favor, introduza uma opção que conste na lista.\n");
    }
  } 
  while(terminar!= 's' && terminar!= 'S'); /*Enquanto a variavel 'terminar' nao receber um S ou s, o prorama nao terminara*/
  return 0;
}

【问题讨论】:

  • 好吧,乍一看,您的case '2'case '0' 缺少break;。另外,您需要检查getchar() 的使用逻辑。
  • 你的问题是getchar()它只读取一个字符,在13的情况下是1,在243的情况下是2。因此,它输入的是case '1':case '2': 而不是default:
  • 试试Stack Overflow in Portuguese(测试版)。

标签: c switch-statement default


【解决方案1】:

您必须将opcao 声明为int 并使用

scanf("%d",&opcao);

而不是

opcao=getchar();

switch-case 看起来像

switch(opcao)
{
case 1://code
  break;
case 2://code
  break;
case 3://code
  break;
case 4://code
  break;
case 5://code
  break;
case 0://code
  break;
default://code
}

您无法通过扫描字符来检测用户是否输入了多个字符。您必须使用int。由于您所有的cases 都由数字组成,因此您在运气。

【讨论】:

  • 为什么建议使用int
  • 我试过你的方法,但现在它根本不接受任何字符,甚至是选项。它给了我一个我在默认值中建立的打印。
  • @Gopi , 为什么在处理数字时使用char 数据类型?
  • @Nikita,你把case '1'改成case 1了吗?对于所有其他情况类似
【解决方案2】:

您是在比较字符代码,而不是数字。 getchar 只读取一个字符。如果您输入一个数字,它将读取一个数字(以字符形式),因此无论数字有多长,只有第一个数字会进入 switch 语句。你需要解决这个问题。

如何做:将getchar 替换为一些读取和解析数字的函数。在 switch 语句中,不要比较字符代码,而是数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多