鱼C论坛

 找回密码
 立即注册
查看: 1553|回复: 2

[已解决]C语言初学求助,下面的问题咋处理?

[复制链接]
发表于 2017-9-4 19:43:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

char get_first();
float get_num();
char get_choice();

void main()
{
    char cho;
    float a, b;
    while((cho = get_choice()) != 'q')
    {
        printf("Enter first number: ");
        a = get_num();
        printf("Enter second number: ");
        b = get_num();
        switch (cho)
        {
            case 'a': printf("%g + %g = %g\n", a, b, a + b);
                break;
            case 's': printf("%g - %g = %g\n", a, b, a - b);
                break;
            case 'm': printf("%g * %g = %g\n", a, b, a * b);
                break;
            case 'd':
                while (b == 0)
                {
                    printf("Enter a number other than 0: ");
                    b = get_num();
                }
                printf("%g / %g = %g\n", a, b, a / b);
                break;
            default :printf("Program error !\n");
                break;
        }
    }
    printf("Bye!\n");
}

float get_num()
{
    float num;
    char cht;
    while ((scanf("%f", &num)) != 1)
    {
        while ((cht = getchar()) != '\n')
            putchar(cht);
        printf(" is not a num.\n");
        printf("Please enter a number, such as 2.5, -1.78E8, or 3: ");
    }
    return num;
}

char get_first()
{
    char ch;
    ch = getchar();
    while ( getchar() != '\n' )
        continue;
    return ch;
}

char get_choice()
{
    char chi;
    printf("Enter the operation of your choice:\n");
    printf("a. add            s. subtract\n");
    printf("m. multiply    d. divide\n");
    printf("q. quit\n");

    chi = get_first();
    while((chi != 'a') && (chi != 's') && (chi != 'm') && (chi != 'd') && (chi != 'q'))
    {
        printf("Please respond with a, s, m, d or q!\n");
        chi = get_first();
    }
    return chi;
}

这个程序中第一次运行正常,第二次输入字符时不能正常运行,直到再输入一次才正常,求助这是怎么回事呀,运行结果如下:
Enter the operation of your choice:\n");
a. add            s. subtract
m. multiply        d. divide
q. quit
a
Enter first number: 22
Enter second number: 1
22 + 1 = 23
d
Please respond with a,s, m, d, q!
d
Enter first number:................(剩下的略过,每次都需要输入两边才能正常执行) 求教这是怎么回事
最佳答案
2017-9-4 20:57:02
2017-09-04_205550.png
#include <stdio.h>

char get_first();
float get_num();
char get_choice();

void main()
{
    char cho;
    float a, b;
    while((cho = get_choice()) != 'q')
    {
        printf("Enter first number: ");
        a = get_num();
        printf("Enter second number: ");
        b = get_num();
        switch (cho)
        {
            case 'a': printf("%g + %g = %g\n", a, b, a + b);
                break;
            case 's': printf("%g - %g = %g\n", a, b, a - b);
                break;
            case 'm': printf("%g * %g = %g\n", a, b, a * b);
                break;
            case 'd':
                while (b == 0)
                {
                    printf("Enter a number other than 0: ");
                    b = get_num();
                }
                printf("%g / %g = %g\n", a, b, a / b);
                break;
            default :printf("Program error !\n");
                break;
        }
    }
    printf("Bye!\n");
}

float get_num() 
{
    float num;
    char cht;
    while ((scanf("%f", &num)) != 1)
    {
        while ((cht = getchar()) != '\n')
            putchar(cht);
        printf(" is not a num.\n");
        printf("Please enter a number, such as 2.5, -1.78E8, or 3: ");
    }
         while ( getchar() != '\n' );//清空键盘缓冲区数据
    return num;
}

char get_first()
{
    char ch;
    ch = getchar();
        while ( getchar() != '\n' );//清空键盘缓冲区数据
    return ch;
}

char get_choice()
{
    char chi;
    printf("Enter the operation of your choice:\n");
    printf("a. add            s. subtract\n");
    printf("m. multiply    d. divide\n");
    printf("q. quit\n");

    chi = get_first();
    while((chi != 'a') && (chi != 's') && (chi != 'm') && (chi != 'd') && (chi != 'q'))
    {
        printf("Please respond with a, s, m, d or q!\n");
        chi = get_first();
    }
    return chi;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-4 20:57:02 | 显示全部楼层    本楼为最佳答案   
2017-09-04_205550.png
#include <stdio.h>

char get_first();
float get_num();
char get_choice();

void main()
{
    char cho;
    float a, b;
    while((cho = get_choice()) != 'q')
    {
        printf("Enter first number: ");
        a = get_num();
        printf("Enter second number: ");
        b = get_num();
        switch (cho)
        {
            case 'a': printf("%g + %g = %g\n", a, b, a + b);
                break;
            case 's': printf("%g - %g = %g\n", a, b, a - b);
                break;
            case 'm': printf("%g * %g = %g\n", a, b, a * b);
                break;
            case 'd':
                while (b == 0)
                {
                    printf("Enter a number other than 0: ");
                    b = get_num();
                }
                printf("%g / %g = %g\n", a, b, a / b);
                break;
            default :printf("Program error !\n");
                break;
        }
    }
    printf("Bye!\n");
}

float get_num() 
{
    float num;
    char cht;
    while ((scanf("%f", &num)) != 1)
    {
        while ((cht = getchar()) != '\n')
            putchar(cht);
        printf(" is not a num.\n");
        printf("Please enter a number, such as 2.5, -1.78E8, or 3: ");
    }
         while ( getchar() != '\n' );//清空键盘缓冲区数据
    return num;
}

char get_first()
{
    char ch;
    ch = getchar();
        while ( getchar() != '\n' );//清空键盘缓冲区数据
    return ch;
}

char get_choice()
{
    char chi;
    printf("Enter the operation of your choice:\n");
    printf("a. add            s. subtract\n");
    printf("m. multiply    d. divide\n");
    printf("q. quit\n");

    chi = get_first();
    while((chi != 'a') && (chi != 's') && (chi != 'm') && (chi != 'd') && (chi != 'q'))
    {
        printf("Please respond with a, s, m, d or q!\n");
        chi = get_first();
    }
    return chi;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-4 21:34:29 | 显示全部楼层
本帖最后由  乐天lgk 于 2017-9-4 21:37 编辑


还有,请问一下,我在原来的基础上没有清理get_num函数的键盘缓冲区的数据,而是在get_first函数中,清理缓冲数据之前,添加了while(isspace(ch = getchar())); 程序也能正常运行,这是为啥,貌似和清理get_num函数的缓冲数据没什么关联呀?

这个while(isspace(ch = getchar()))是不是把之前的数据缓冲也给清理了呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-28 16:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表