鱼C论坛

 找回密码
 立即注册
查看: 1474|回复: 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

  1. #include <stdio.h>

  2. char get_first();
  3. float get_num();
  4. char get_choice();

  5. void main()
  6. {
  7.     char cho;
  8.     float a, b;
  9.     while((cho = get_choice()) != 'q')
  10.     {
  11.         printf("Enter first number: ");
  12.         a = get_num();
  13.         printf("Enter second number: ");
  14.         b = get_num();
  15.         switch (cho)
  16.         {
  17.             case 'a': printf("%g + %g = %g\n", a, b, a + b);
  18.                 break;
  19.             case 's': printf("%g - %g = %g\n", a, b, a - b);
  20.                 break;
  21.             case 'm': printf("%g * %g = %g\n", a, b, a * b);
  22.                 break;
  23.             case 'd':
  24.                 while (b == 0)
  25.                 {
  26.                     printf("Enter a number other than 0: ");
  27.                     b = get_num();
  28.                 }
  29.                 printf("%g / %g = %g\n", a, b, a / b);
  30.                 break;
  31.             default :printf("Program error !\n");
  32.                 break;
  33.         }
  34.     }
  35.     printf("Bye!\n");
  36. }

  37. float get_num()
  38. {
  39.     float num;
  40.     char cht;
  41.     while ((scanf("%f", &num)) != 1)
  42.     {
  43.         while ((cht = getchar()) != '\n')
  44.             putchar(cht);
  45.         printf(" is not a num.\n");
  46.         printf("Please enter a number, such as 2.5, -1.78E8, or 3: ");
  47.     }
  48.          while ( getchar() != '\n' );//清空键盘缓冲区数据
  49.     return num;
  50. }

  51. char get_first()
  52. {
  53.     char ch;
  54.     ch = getchar();
  55.         while ( getchar() != '\n' );//清空键盘缓冲区数据
  56.     return ch;
  57. }

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

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

使用道具 举报

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

  1. #include <stdio.h>

  2. char get_first();
  3. float get_num();
  4. char get_choice();

  5. void main()
  6. {
  7.     char cho;
  8.     float a, b;
  9.     while((cho = get_choice()) != 'q')
  10.     {
  11.         printf("Enter first number: ");
  12.         a = get_num();
  13.         printf("Enter second number: ");
  14.         b = get_num();
  15.         switch (cho)
  16.         {
  17.             case 'a': printf("%g + %g = %g\n", a, b, a + b);
  18.                 break;
  19.             case 's': printf("%g - %g = %g\n", a, b, a - b);
  20.                 break;
  21.             case 'm': printf("%g * %g = %g\n", a, b, a * b);
  22.                 break;
  23.             case 'd':
  24.                 while (b == 0)
  25.                 {
  26.                     printf("Enter a number other than 0: ");
  27.                     b = get_num();
  28.                 }
  29.                 printf("%g / %g = %g\n", a, b, a / b);
  30.                 break;
  31.             default :printf("Program error !\n");
  32.                 break;
  33.         }
  34.     }
  35.     printf("Bye!\n");
  36. }

  37. float get_num()
  38. {
  39.     float num;
  40.     char cht;
  41.     while ((scanf("%f", &num)) != 1)
  42.     {
  43.         while ((cht = getchar()) != '\n')
  44.             putchar(cht);
  45.         printf(" is not a num.\n");
  46.         printf("Please enter a number, such as 2.5, -1.78E8, or 3: ");
  47.     }
  48.          while ( getchar() != '\n' );//清空键盘缓冲区数据
  49.     return num;
  50. }

  51. char get_first()
  52. {
  53.     char ch;
  54.     ch = getchar();
  55.         while ( getchar() != '\n' );//清空键盘缓冲区数据
  56.     return ch;
  57. }

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

  65.     chi = get_first();
  66.     while((chi != 'a') && (chi != 's') && (chi != 'm') && (chi != 'd') && (chi != 'q'))
  67.     {
  68.         printf("Please respond with a, s, m, d or q!\n");
  69.         chi = get_first();
  70.     }
  71.     return chi;
  72. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-4-25 18:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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