C语言 如果条件不满足,如何返回到案例的开始

fnatzsnv  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(202)

`

switch(selectedOption){
  case 'B':
    printf("Please enter the first number\n");
    if (scanf("%f", &firstNumber) == 1){
       printf("Is a valid number\n");
    }
    else{
       printf("Is not a valid number\n");
    }
}

`
我有一个学校作业,我必须编写一个计算器。其中一个要求是要求用户输入另一个数字,例如,如果他们输入一个字符而不是一个数字。我不知道如何去做这件事,我到处找,没有解决方案是有意义的。如果有人能帮助我解决这个问题,我将不胜感激。

hpcdzsge

hpcdzsge1#

简单的回答是循环直到有效的输入被读取(假设输入来自交互代理,例如坐在终端的人)。
下列将无法运作

switch(selectedOption){
  case 'B':
    while (1) {
      printf("Please enter the first number\n");
      if (scanf("%f", &firstNumber) == 1){
         printf("Is a valid number\n");
         break;
      }
      else{
         printf("Is not a valid number\n");
      }
    }
    /* ... */
    break;
}

问题是,当scanf看到一个不是数字的一部分的字符时,它将停止阅读输入,并将该字符推回到流中(c.f. ungetc)。例如,如果输入为-foo,则scanf将读取空格,然后-(可能是数字的一部分),然后是不是数字的一部分的ff将被推回到流中,scanf将返回0。在while循环的下一次迭代中,scanf将读取f,将其推回到流中并返回0。循环无限等。
要中断无限循环,代码需要从流中读取一些内容并将其丢弃。一个选项是通过调用scanf("%*s");读取并丢弃下一个单词,或者通过调用scanf("%*s%*c");丢弃下一个单词和后面的空白字符,或者通过调用scanf("%*[^\n]%*c");丢弃行的剩余部分和换行符。例如:

switch(selectedOption){
  case 'B':
    while (1) {
      printf("Please enter the first number\n");
      if (scanf("%f", &firstNumber) == 1){
         printf("Is a valid number\n");
         break;
      }
      else{
         printf("Is not a valid number\n");
         scanf("%*s");
      }
    }
    /* ... */
    break;
}

请注意,上面的代码会将42foo之类的输入视为有效。scanf会将f推回到流中并返回1,因为它读取了一个有效的数字42。您可能需要读取下一个字符并检查它是否有意义。通过调用ungetc(ch, stdin);,您始终可以将至少一个字符推回到流中,以便以后可以重新读取它。

4uqofj5v

4uqofj5v2#

您不需要切换大小写。您只需要执行以下操作:

while (true) {
    char number = 0;
    scanf_s("%c", &number);
    if (number >= '0' && number <= '9') break;
    else printf("Is not a valid number\n");
}

相关问题