Code Bye

新手第一帖,想请教下关于格式化输入scanf配合switch的问题的讨论

我用的是VC6.0,写些小程序有个习惯,就是用while(flag){do sth.}来循环表示菜单,若需要退出则在while里将flag置0。
而菜单选项则用switch(order)来表示,一般order是定义为unsigned char的,用scanf来读取。
这样若乖乖的输入整数,这个菜单便没问题。
但是一旦输入的order为小数或者字母什么的,菜单便会一直自己跑停不下来
为什么会出现这种问题?
以下为示例代码
#define TRUE 1
#define FALSE 0
char DisplayMenu() 
{
char order;
printf(“**The order list is as follows:\n”);
printf(“**10 – do what\n”);
printf(“**11 – do what\n”);
printf(“**20 – do what\n”);
printf(“**21 – do what\n”);
printf(“**30 – do what\n”);
printf(“**31 – do what\n”);
printf(“**00 – Exit\n”);
printf(“Please input your order:”);
scanf(“%d”, &order);
return order;
}
char ExecuteOrder(char order)
{
switch (order)
{
case 10:
{
do what
return TRUE;
}
case 11:
{
do what
return TRUE;
}
case 20:
{
do what
return TRUE;
}
case 21:
{
do what
return TRUE;
}
case 30:
{
do what
return TRUE;
}
case 31:
{
do what
return TRUE;
}
case Exit:
{
return FALSE;
}
default:
{
printf(“Illegal order!\n\n\n\n\n\n\n\n”);
return TRUE;
}
}
}
int main(void)
{
char instruction = 0;
char flag = TRUE;
while(flag)
{
instruction = DisplayMenu();
flag = ExecuteOrder(instruction);
}
return 0;
}

15分
#include <stdio.h>
#define TRUE 1
#define FALSE 0
char DisplayMenu() {
    int order;

    printf("**The order list is as follows:\n");
    printf("**10 - do what\n");
    printf("**11 - do what\n");
    printf("**20 - do what\n");
    printf("**21 - do what\n");
    printf("**30 - do what\n");
    printf("**31 - do what\n");
    printf("**00 - Exit\n");
    while (1) {
        printf("Please input your order:");fflush(stdout);
        rewind(stdin);
        if (1==scanf("%d", &order)) {
            if (order==0
             || order==10
             || order==11
             || order==20
             || order==21
             || order==30
             || order==31) {
                break;
            }
        }
        printf("Illegal order!\n");
    }
    return order;
}
char ExecuteOrder(char order) {
    switch (order) {
    case 10: {
            do what
                return TRUE;
        }
    case 11: {
            do what
                return TRUE;
        }
    case 20: {
            do what
                return TRUE;
        }
    case 21: {
            do what
                return TRUE;
        }
    case 30: {
            do what
                return TRUE;
        }
    case 31: {
            do what
                return TRUE;
        }
    case 0: {
            return FALSE;
        }
    }
}
int main(void) {
    char instruction = 0;
    char flag = TRUE;
    while(flag) {
        instruction = DisplayMenu();
        flag = ExecuteOrder(instruction);
    }
    return 0;
}
5分
你需要
fflush(stdout);
哦,原来如此,我对标准输入输出流了解还不够深,终于找到原因啦,太谢谢了。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明新手第一帖,想请教下关于格式化输入scanf配合switch的问题的讨论