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

Im creating a program that has a Main Menu linked to a couple of other functions. This is the Main Menu Code

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("nnThank you for using our Programnn ");
                exit = 0;
                break;
            default:
                break;
        }
  }
  getche();
}

So I test my Number to words function which prompts for a User input (Int). But when I enter the number, The function will ask for another number (no printf prompt just a _ that waits for a number input), Lets call this mystery number X.

After the function is done converting the number, The Program will go to main menu for a split second and automatically goes to another function.

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

Here is the code for The num2Word function.

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;
}

The Tenty,Ones, Hundredth and Thousandths all use Switch, same structure as code below:

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;
}

Since I cant post images yet ill try to show how the function output looks like


Enter a Number (Max 3000):
619

//I press enter here and nothing happens
3 //I must input another number for it to show the conversion, in this case number 3.


six hundred nineteen

After this, itll go back to main menu for a split sec and go straight to Main() Switch(iMenuChoice) Case 3.


There's no mystery number X or ghost :)

Change

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

to

scanf("%i",&iWor);

The whitespace characters you have in the format string of scanf, ignores all whitespace characters. That's why you are forced to input a non-whitespace character.


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

There is no mystery number X. The problem in your code is this line:

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

This scanf ignores white-space characters. When a white-space character is specified as directive in scanf . This directive maches any amount of white space, including none, in the input. That's why you have to insert the second "mysterious" value. According to scanf documentation a white space character is a sequence of white-space characters (space, tab, newline etc.; see isspace(3)).

To solve the issue, you can just %i directive. For example:

scanf("%i",&iWor); 

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

链接地址: http://www.djcxy.com/p/72174.html

上一篇: 如果我的字符串没有空终止符,如何返回null

下一篇: 主菜单选择提示在子功能scanf(C)上收集,