0

我尝试编写我的第一个计算器,并在网上找到了一些示例,然后我对其进行了更改以使它们在流程方面更容易。但是,当我从此更改流程时:

#include <stdio.h>

main()
{
    char operator;
    float num1,num2;

    printf("Enter an operator (+, -, *, /): ");
    scanf("%c" ,&operator);
    printf("Enter first operand: ");
    scanf("%f" ,&num1);
    printf("Enter second operand: ");
    scanf("%f" ,&num2); 

    switch(operator)
    {
        case '+':
            printf("num1+num2=%.2f\n" ,num1+num2);
            break;
        case '-':
            printf("num1-num2=%.2f\n" ,num1-num2);
            break;
        case '*':
            printf("num1*num2=%.2f\n" ,num1*num2);
            break;
        case '/':
            printf("num1/num2=%.2f\n" ,num1/num2);
            break;
        default: //of operator is other than +, -, *, /, erros message shown
        printf("Error! Invalid operator, this is basic math only.\n");
    }       
    return 0;
}

对此:

#include <stdio.h>

main()
{
    char operator;
    float num1,num2;


    printf("Enter first operand: ");
    scanf("%f" ,&num1);
    printf("Enter an operator (+, -, *, /): ");
    scanf("%c" ,&operator);
    printf("Enter second operand: ");
    scanf("%f" ,&num2); 

    switch(operator)
    {
        case '+':
            printf("num1+num2=%.2f\n" ,num1+num2);
            break;
        case '-':
            printf("num1-num2=%.2f\n" ,num1-num2);
            break;
        case '*':
            printf("num1*num2=%.2f\n" ,num1*num2);
            break;
        case '/':
            printf("num1/num2=%.2f\n" ,num1/num2);
            break;
        default: //of operator is other than +, -, *, /, erros message shown
        printf("Error! Invalid operator, this is basic math only.\n");
    }       
    return 0;
}

基本上改变了流程:输入运算符,然后输入第一个数字,然后输入第二个数字。To:输入第一个数字,然后输入运算符,然后输入第二个数字。我的问题是,当我这样做时,我看到了 Enter 运算符,但程序跳过了输入运算符的选项并要求:输入第一个数字,然后输入第二个数字。响应是默认开关。

4

3 回答 3

0

您在读取第一个运算符后输入的换行符scanf正在被第二个scanf调用占用。有关更详细的说明,请参阅此问题。

简而言之,像这样写一个函数,每次scanf调用后调用它。

void clear_stdin(void)
{
    while(getchar() != '\n');
}
于 2013-09-22T00:00:01.300 回答
0

这是因为当您输入第一个的输入时,换行符留在缓冲区中scanf,所以下面scanf将其作为输入接收,只需getchar()在每个之后放置一个scanf()即可解决

于 2013-09-22T00:01:01.153 回答
0

输入缓冲区中留下新行。

使用时scanf("%f",...%f使用前导空格,但数字后没有尾随空格 - 通常是\n.

使用scanf("%c",...时,%c不消耗前导空格,也不会消耗尾随空格char

要消耗剩余的空白(例如,\n从上一个scanf()),简单的前面%c有一个空格。

// scanf("%c" ,&operator);
scanf(" %c" ,&operator);  // add space.
于 2013-09-22T05:45:42.903 回答