1

使用一个非常简单的计算器程序,提示用户执行一项操作,然后提示输入两个整数以执行该操作。程序应该在这些操作之后循环,除非用户输入字符'q',此时程序应该退出。

#include <stdio.h>

int main (void)
    {
        char c;
        int number[2], num1, num2, result;
        double num1d, num2d, resultd;
        int done=1;

        while(done)
        {
        printf("\t What sort of operation would you like to perform? \n \t Type + - * / accordingly. \n");
        c = getchar();
        printf("\tplease enter a number \n");
        scanf("%d",&number[0]);
        printf("\tplease enter another number \n");
        scanf("%d",&number[1]);
        num1 = number[0];
        num2 = number[1];

        switch(c)
            {
            case('-'):
            result = num1-num2;
            printf("\nThe first number you entered subtracted by the second number is %d.\n", result);
            break;

            case('+'):
            result = num1+num2;
            printf("The first number you entered added to the second number is %d.\n", result);
            break;

            case('*'):
            result = num1*num2;
            printf("The first number you entered multiplied with the second number is %d.\n", result);
            break;

            case('/'):
            num1d = (double) num1;
            num2d = (double) num2;
            resultd = num1d/num2d;
            printf("The first number you entered divided by the second number is %g.\n", resultd);;
            break;

            case('q'):
            printf(" Now Exiting...\n");
            done=0;
            break;

            default:
            puts("Invalid key pressed. Press q to exit");
            break;
            }
        }

        return 0;
    }

对单个计算正常工作,但随后执行异常;特别是它打印

printf("\t What sort of operation would you like to perform? \n \t Type + - * / accordingly. \n");
printf("\tplease enter a number \n");

共。

清除输入缓冲区的标准方法while (getchar() != '\n');不能解决这个问题。此文本显示不正确的两倍,用户仍然可以使用程序,就好像指令显示正常一样(因此用户可以键入操作,例如 +,回车,然后是一些整数和回车,并且程序将从那时起正确执行)每隔一次程序将“按下无效键。按 q 退出”,无论输入如何。

4

4 回答 4

4

这里的其他人都说的是真的,getchar()返回一个,int但这不是你的问题。

问题是getchar()使用后会留下换行符。如果您要使用,则getchar()必须始终在之后使用换行符。这个简单的修复:

   printf("\t What sort of operation would you like to perform? \n \t Type + - * / accordingly. \n");
    c = getchar();
    getchar();     //<-- here we do an extra getchar for the \n
    printf("\tplease enter a number \n");
    scanf("%d",&number[0]);
    printf("\tplease enter another number \n");
    scanf("%d",&number[1]);

这将消除问题。每次您键入<somechar><enter>时,实际上都会在缓冲区中放置两个字符,例如,如果我按 + 并输入,我会得到:

'+''\n'  // [+][\n]

getchar()只会得到其中的第一个,然后当getchar()再次被调用时,它不会等待您的输入,它只会接受'\n'并继续scanf()

于 2012-11-19T12:28:14.753 回答
3

您不应将逐个字符与更高级的输入函数(例如scanf(). 最好也使用scanf()输入命令字符,但当然你必须在命令后按回车。我相信这是你问题的根本原因。

顺便说一句,请注意getchar(),尽管它的名字,返回int而不是 char。这是因为它可以返回EOF一个特殊常量,它的值不同于所有字符的值。

此外,您应该始终检查 I/O 函数的返回值,scanf()如果输入与模式字符串不匹配,它们可能会失败。

作为调试提示,你当然可以c在解释它之前打印它的值,这样你可以更容易地看到和理解程序的流程。

于 2012-11-19T12:03:43.637 回答
2

我猜它第一次有效,但下次不行。这是因为scanf调用将换行符留在输入缓冲区中,因此下一次getchar在循环中调用它将返回换行符。scanf在调用中的格式后添加一个空格

scanf("%d ",&number[0]);

它将丢弃缓冲区中剩余的空白。

使用调试器单步执行代码并检查变量以进行验证。

于 2012-11-19T12:07:11.207 回答
0

你的 getchar 应该返回int。原因如下

getchar reads characters from the program's standard input 
and returns an int value suitable for storing into a char. 
The int value is for one reason only: not only does getchar 
return all possible character values, but it also returns an 
extra value to indicate that end-of-input has been seen. 
The range of a char might not be enough to hold this extra value, 
so the int has to be used.

所以基本上你需要char cint c你的代码中改变

于 2012-11-19T12:07:04.430 回答