主菜单选择提示甚至收集子功能 scanf (C)

Main Menu choice prompt is gathered even on sub Function scanf (C)

我正在创建一个程序,该程序的主菜单链接到其他几个功能。这是主菜单代码

int main(){

 int iMenuChoice,exit;
 iMenuChoice=0;
 exit =1;

 while (exit !=0){
  system("cls");
  printf("**********Main Menu************\n");
  printf("*1) Cartesian Plane           *\n");
  printf("*2) Number to Words           *\n");
  printf("*3) b          *\n");
  printf("*4) c   *\n");
  printf("*5) d        *\n");
  printf("*6) e        *\n");
  printf("*7) Exit                      *\n");
  printf("*******************************\n");
  scanf("%d",&iMenuChoice);

  switch (iMenuChoice) {
            case 1:
                Cartisian();
                break;
            case 2:
                Num2Word();
                break;
            case 3:                 
                break;
            case 4:                 
                break;
            case 5:                 
                break;
            case 6:
                break;
            case 7:
                system("cls");
                printf("\n\nThank you for using our Program\n\n ");
                exit = 0;
                break;
            default:
                break;
        }
  }
  getche();
}

所以我测试了我的数字到单词功能,它提示用户输入 (Int)。 但是当我输入数字时,该函数会要求输入另一个数字(没有 printf 提示只是一个等待数字输入的 _),让我们称这个神秘数字为 X.

该功能完成号码转换后,程序会瞬间进入主菜单并自动进入另一个功能。

我意识到神秘数字 X 不知何故被用作高级菜单输入!我不知道我做错了什么。

这是 num2Word 函数的代码。

int Num2Word()
{

    int iWor,iOnes,iTens,iHundred,iThousand;
    system("cls");
    printf("Enter a number(max 3000)\n");
    scanf("%i \n",&iWor);

    if(iWor<=3001)
    {
    iOnes=iWor%10;
    iWor=iWor/10;
    iTens=iWor%10;
    iWor=iWor/10;
    iHundred=iWor%10;
    iWor=iWor/10;
    iThousand=iWor%10;

    Thousand(iThousand);
    Hundred(iHundred);
    if(iTens!=1)
    {
        Tenty(iTens);
        Ones(iOnes);
    }
    if(iTens==1)
    Exception(iOnes);
    }
    else{
    printf("beyond 3000");
    }
    getche();
    return 0;
}

十位、个位、百位、千位均使用Switch,结构同下代码:

int Ones(int x)
{
    if(x!=0){
    switch(x)
    {
        case 1:
        printf("One");
        break;
        case 2:
        printf("Two");
        break;
        case 3:
        printf("Three");
        break;
        case 4:
        printf("Four ");
        break;
        case 5:
        printf("Five");
        break;
        case 6:
        printf("Six");
        break;
        case 7:
        printf("Seven");
        break;
        case 8:
        printf("Eight");
        break;
        case 9:
        printf("Nine");
        break;
        default:
        break;
    }
}
    return;
}

因为我无法 post 图片,所以我会尝试展示函数输出的样子


输入一个数字(最多 3000):
第619章【=34=】
//我在这里按下回车,但没有任何反应
3 //我必须输入另一个数字才能显示转换,在本例中为数字 3。


六百一十九

之后,它会回到主菜单,然后直接进入 Main() Switch(iMenuChoice) Case 3.

没有神秘数字 X 或幽灵 :)

改变

scanf("%i \n",&iWor); 

scanf("%i",&iWor);

scanf 格式字符串中的空白字符将忽略所有空白字符。这就是您被迫输入非空白字符的原因。

I realized that The mystery number X is somehow being used as an advance menu input! I dont know what i did wrong.

没有神秘数字 X。您的代码中的问题是这一行:

scanf("%i \n",&iWor); 

scanf 忽略白色-space 字符。当白色-space 字符被指定为scanf 中的指令时。该指令在输入中加工任意数量的白色 space,包括 none。这就是您必须插入第二个 "mysterious" 值的原因。根据 scanf 文档,白色 space 字符是一系列白色-space 字符(space、制表符、换行符等;参见 space(3 )).

要解决这个问题,你可以只用%i指令。例如:

scanf("%i",&iWor); 

文档:http://man7.org/linux/man-pages/man3/scanf.3.html