乐天lgk 发表于 2017-9-4 19:43:58

C语言初学求助,下面的问题咋处理?

#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:................(剩下的略过,每次都需要输入两边才能正常执行) 求教这是怎么回事

ba21 发表于 2017-9-4 20:57:02



#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;
}

乐天lgk 发表于 2017-9-4 21:34:29

本帖最后由乐天lgk 于 2017-9-4 21:37 编辑

ba21 发表于 2017-9-4 20:57


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

这个while(isspace(ch = getchar()))是不是把之前的数据缓冲也给清理了呀?
页: [1]
查看完整版本: C语言初学求助,下面的问题咋处理?