0

大家好,我编写了 kfc 菜单之类的代码,并且我让它工作(最后),但是当我为“菜单”输入数字以外的东西时,例如:字母“A”,我就是无法让它再次循环正常,而是完成程序

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char counter='y';
    float totalprice=0;

    while (counter=='Y'  ||  counter=='y')
    {
        int menu;
        float price=0;

        printf("\nplease select from menu:");
        scanf (" %i", &menu);

        switch(menu)
        {
          case  1: {
              printf("\none hotbox1 =RM10.50");
              totalprice=totalprice+10.50;
              break;
          }
          case   2: {
              printf ("\none hotbox2=RM10.60");
              totalprice=totalprice+10.60;
              break;
          }
          case   3:{
              printf ("\none hotbox3=RM10.70");
              totalprice=totalprice+10.70;
              break;
          }
          default : {
              printf ("\nplease enter proper number please:");
              scanf("%2f", &menu);
              break;
          }
        }

        printf("\n\nadd order?(Y/N):");
        scanf (" %c", &counter);
    }

    printf("\n\nThe total price is: %f", totalprice);
    return 0;
}
4

7 回答 7

1

您应该先使用fgets()( reference here ),然后使用sscanf()( reference here),检查它的返回值是否为数字。

char inputBuffer[MAX_BUFFER];

do
{
    fgets(inputBuffer, MAX_BUFFER, stdin);
}
while(sscanf(inputBuffer, "%d", &menu) != 1)
于 2013-10-25T16:52:36.087 回答
0

你可以试试这样的

#include <stdio.h>    
int main()
{
    char counter;
    float totalprice=0;
    int menu=0;
    do
    {
        printf("\n1. one hotbox1=RM10.50");
        printf("\n2. one hotbox2=RM10.60");
        printf("\n3. one hotbox3=RM10.70");
        printf("\nplease select from menu:");
        scanf ("%d", &menu);
        switch(menu)
        {
          case 1:
              printf("\none hotbox1 =RM10.50");
              totalprice=totalprice+10.50;
              break;
          case 2:
              printf ("\none hotbox2=RM10.60");
              totalprice=totalprice+10.60;
              break;
          case 3:
              printf ("\none hotbox3=RM10.70");
              totalprice=totalprice+10.70;
              break;
          default :
              printf ("\nplease enter proper number please:");
              scanf("%d", &menu);
        }
        printf("\n\nadd more order?(Y/N):");
        fflush(stdin);      //to empty the input stream.
        scanf("%c",&counter);
    }while(tolower(counter) != 'n'); //tolower returns the lowercase character.

    printf("\n\nThe total price is: %.2f", totalprice);
    return 0;
}
于 2013-10-25T17:27:50.720 回答
0

在默认情况下,您使用 scanf 进行扫描%f,我相当确定这是用于浮动的。使用%d.

于 2013-10-25T16:54:04.573 回答
0

消除scanf("%2f", &menu);

于 2013-10-25T16:54:36.943 回答
0

scanf("%i", &menu)尝试从输入中读取整数时,它会找到A,它不能将其解释为数字,因此它不会读取它(*)。然后下一个 scanf 继续读取另一个停止时的输入,并愉快地读取字母“A”。因为只要读取的字母是“y”或“Y”(A 都不是),它就会退出循环。

(*) 阅读 scanf 的文档以了解如何判断它是否遇到错误。

注意:scanf("%i", &menu)应该是scanf("%d", &menu) as%d` 是整数的格式化符号。

一种解决方案是将循环条件更改为:

while (counter!='N' && counter!='n')
{
  ...
}

这样,只有在输入明确的“N”或“n”时才结束循环。

注意:如果您不小心为菜单项输入了“n”,这将无济于事,因此请参阅上面有关错误处理的注释。

于 2013-10-25T16:55:38.177 回答
0

C 中的 Switch 不支持 switch-case 中的字符。在开始 switch-case 之前验证用户输入。如果是数字,则进入 switch case,否则显示用户消息以仅输入数值

于 2013-10-25T16:57:05.970 回答
0

我建议您通过在循环中的各个点打印出“计数器”的值来调试它(即在您读入它之后,在循环的底部等)。这将使您了解您的代码在做什么。

于 2013-10-25T17:00:08.777 回答