• C语言--scanf


    关于C语言的scanf,首先看个例子

    int get_int(void){
            int input;
            char ch;
            while(scanf("%d",&input)!=1){
                    printf("is not an integer,please enter agin
    ");
            }
            printf("%d
    ",input);
            return input;
    }

    这个例子中,如果你输入的不是一个数字的话,程序就会陷入死循环,原因: 如果scanf没有成功读取输入就会将其留在输入队列中,所以下次再从输入队列中读取的时候,还是失败,所以循环了

    改正:

    int get_int(void){
            int input;
            char ch;
            while(scanf("%d",&input)!=1){
                    while(getchar()!='
    '){
                            continue;
                    }
                    printf("is not an integer,please enter agin
    ");
            }
            printf("%d
    ",input);
            return input;
    }

    从输入队列中剔除那些有问题的输入

    例子:

    /**
     * menu.c
     * @desc 菜单技术
     */
    #include <stdio.h>
    char get_choice(void);
    char get_first(void);
    int get_int(void);
    void count(void);
    
    int main(void){
            char choice;
            choice = get_choice();
            if(choice != 'q'){
                    switch(choice){
                            case 'a':
                                    printf("Buy low, sell high
    ");
                                    break;
                            case 'b':
                                    putchar('a');
                                    break;
                            case 'c':
                                    count();
                                    break;
                            default:
                                    printf("Program error!
    ");
                                    break;
                    }
            }
            printf("Bye
    ");
    }
    
    /**
     * 获取一个整数型的输入
     */
    int get_int(void){
            int input;
            printf("Please input a int:
    ");
            while(scanf("%d",&input) != 1){
                    printf("input error,Please input again:
    ");
                    while(getchar() != '
    '){
                            continue;
                    }
            }
            return input;
    }
    
    /**
     * 获取用户输入字符串的第一个字符
     */
    char get_first(void){
            char ch;
            ch = getchar();
            //清空输入队列中的其他字符
            while(getchar() != '
    '){
                    continue;
            }
            return ch;
    }
    
    char get_choice(void){
            char ch;
            printf("Enter the letter if your choice:
    ");
            printf("a. advice                       b. bell
    ");
            printf("c. count                        q. quit
    ");
            ch = get_first();
            while((ch < 'a' || ch > 'c') && ch != 'q'){
                    printf("Please choice a b c or q
    ");
                    ch = get_first();
            }
            return ch;
    }
    
    void count(void){
            int n,i;
            printf("Count how far? Enter a integer:
    ");
            n=get_int();
            for(i=1;i<=n;i++){
                    printf("%d
    ",i);
            }
            while(getchar() != '
    '){
                    continue;
            }
    }
  • 相关阅读:
    bzoj 3456 城市规划 —— 分治FFT / 多项式求逆 / 指数型生成函数(多项式求ln)
    洛谷 P4721 [模板]分治FFT —— 分治FFT / 多项式求逆
    CF 438 E & bzoj 3625 小朋友和二叉树 —— 多项式开方
    Codeforces 447
    Codeforces 1099
    Codeforces 991
    Codeforces 994
    Codeforces 989
    Codeforces 1084
    xj膜你赛(n-1)
  • 原文地址:https://www.cnblogs.com/bai-jimmy/p/4402406.html
Copyright © 2020-2023  润新知