求解答关于c里输入流的问题

求解答,每次输入主函数里的while循环完后需要换行再次输入相应的标识符才行。这个现象的原因是什么?该如何解决?

#include <stdio.h>

void add(void);
void subtract(void);
void multiply(void);
void divide(void);
void test(void);
void empty(void);
void empty_(void);
char get_first(void);

float x, y, up_A, up_B, up_C, up_D;

int main(void)
{
    char ch;

    printf("根据提示选择需要的运算\n");
    printf("选择需要的算法,运算完成输入q退出。\n");
    printf("A.加法           B.减法\n");
    printf("C.乘法           D.除法\n");    

    while((ch = get_first()) != 'q'){
        switch(ch){
            case 'A': add();
                      break;
            case 'B': subtract();
                      break;
            case 'C': multiply();
                      break;
            case 'D': divide();
                      break;
            default:  //printf("无相关标识符\n");
                      break;
        }

     //printf("本次运算完成,需要其他运算则输入相应标识符。退出输入q\n");
    }

    return 0;
}

void add(void)
{

    printf("请输入两个数字空格隔开,    点击Enter开始运算\n");
    test();

    up_A = x + y;
    printf("两数之和=%.2f\n", up_A);
}

void subtract(void)
{

    printf("请输入两个数字空格隔开(数值大的作为被减数),点击Enter开始运算\n");
    test();
    
    if (x >y)
        up_B = x - y;
    else
        up_B = y - x;
    printf("两数之差=%.2f\n", up_B);
}

void multiply(void)
{

    printf("请输入两个数字空格隔开,    点击Enter开始运算\n");
    test();
    
    printf("两数的乘积=%.2f\n", up_C = x * y);
}

void divide(void)
{

    printf("请输入两个数字空格隔开(前者为被除数后者为除数),    点击Enter开始运算\n");
    test();
    while(y == 0){
        printf("除数不可为0,请重新输入!\n");
        scanf("%f", &y);
    }

    printf("两数之商=%.2f\n", up_D = x / y);

}

void test(void)
{

        if (scanf("%f", &x) == 1){
                if (scanf("%f", &y) == 1){
                    /*up = x + y;
                    printf("和=%.2f\n", up);*/
                }
                else{
                    empty_();
                    printf("第二个数存在错误,请重新输入第二个数\n");
                    scanf("%f", &y);
                    /*up = x + y;
                    printf("和=%.2f\n", up);*/
            }
        }
        else{
                empty();
                if(scanf("%f", &y) == 1){
                    printf("第一个数据存在错误,请重新输入\n");
                    while(scanf("%f", &x) != 1)
                        printf("数据错误请重新输入\n");
                }
                else{ 
                    empty_();
                    test();
                }
        }
}

void empty(void)
{
    while(getchar() != ' ')   //清空字符至空格
        continue;
}

void empty_(void)
{
    while(getchar() != '\n')    //清空字符至换行
        continue;
}

char get_first(void)
{

    char ch,l;
    
    ch = getchar();
    while((l = getchar()) != '\n')
        continue;
    /*if(ch == '\n' || ch == ' ')
        get_first();*/

    return ch;
}

因为你的get_first要求输入换行符才退出循环

/n是换行的意思呀,敲了回车才能换行呀。

确切的说是又循环了一次

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632