C中的计算器程序

时间:2013-11-19 18:29:26

标签: c calculator

我正在尝试用C语言编写一个计算器程序。

输入必须完全采用以下形式:

a oper b

其中a,b是double和oper类型的数字是这些字符+, - ,*,/。

代码:

int main()
{
   char oper;
   double a, b;

   printf("What do you want to calculate?\n");
   if (scanf("%lf %1[-+/*] %lf", &a, &oper, &b) != 3)
        printf("Error. Invalid input.\n");
    else {

   switch(oper)
   {
    case '+':
        printf("%f+%f=%.2f",a,b,a+b);
        break;
    case '-':
        printf("%f-%f=%.2f",a,b,a-b);
        break;
    case '*':
        printf("%f*%f=%.2f",a,b,a*b);
        break;
    case '/':
        if(b != 0)
        {
                    printf("%f/%f=%.2f",a,b,a/b);
            break;
        }
        else
        {
            printf("Error! You can not divide by 0.");
            break;
        }
    default:
        printf("Error! Invalid operator.");
        break;
   }}
   return 0;
}

问题:

当用户输入例如此输入时:

123

程序将冻结。

同时,当用户输入例如这些输入时:

123 5
123 ab
Hello

我们的程序将打印

ERROR. Invalid input.

我真的需要你的帮助。如果我们输入这个输入,请你修改我的代码,例如:

123

我们的程序将打印

ERROR. Invalid input.

Thaks

4 个答案:

答案 0 :(得分:3)

fgets开始:

char buffer[256];
printf("What do you want to calculate?\n");
fgets(buffer, 256, stdin);
if (sscanf(buffer, "%lf %1[-+/*] %lf", &a, &oper, &b) != 3)
    printf("Error. Invalid input.\n");
// .. rest of the code

答案 1 :(得分:3)

您的程序在输入123上“冻结”,因为当用户按Enter键时,scanf未完成读取;它期待操作员和其他操作数跟随。您可以在后续行中输入这些内容。这是因为scanf格式化程序中的任何空格都可以代表输入中任何数量和类型的空格,即123\n+\n\t 456有效并产生与输入123+456相同的结果。

我建议一次用fgets一行读取一行到缓冲区中,然后从那里解析它,例如sscanf。如果你只想坚持scanf,可以使格式不允许换行分隔符,但是必须在运算符和操作数之间有空格:

if (scanf("%lf%*[ \t]%1[-+/*]%*[ \t]%lf", &a, &oper, &b) != 3)

编辑:另外,正如@chux所指出的,将%1[-+/*]的结果存储在char oper中是不正确的,因为%[]格式化程序会生成一个字符串,这意味着终止NUL角色必须有空间。将类型更改为char oper[2]或将格式更改为%c

答案 2 :(得分:1)

在我的测试中,当你输入“123”时程序没有被冻结,它只是等待下一行的更多输入。如果你想强制它从一行获取所有输入,最简单的方法是我知道如何将字符串读入内存,然后使用sscanf()扫描字符串。

所以程序的顶部看起来像这样:

int main()
{
    char line[100] ;
    char oper[4];
    double a, b;

    printf("What do you want to calculate?\n");
    if ( ! fgets(line, sizeof(line), stdin))
        { printf("No input.\n") ;  exit( 1) ; }
    if (sscanf(line, "%lf %1[-+/*] %lf\n", &a, &oper, &b) != 3)
        printf("Error. Invalid input.\n");
    else {
        switch (* oper) {

此外,您可能希望在输出后添加换行符。

答案 3 :(得分:0)

#include<Stdio.h>
int main()
{
 double a,b;
 char operator;
 puts("Please enter your two operands");
 printf("operand no 1 = ");
 scanf("%f",&a);
 printf("operand no 2 = ");
 scanf("%f",&b);
 puts("Now choose what do you want to calculate");
 printf("+ - * / which one : ");
 scanf("%c",operator);
 if(operator=='+')
   printf("ans = %f ",a+b);
 else if(operator=='-')
   printf("ans = %f ",a-b);
 elseif(operator=='*')
   printf("ans = %f ",a*b);
 else if(operator=='/')
   printf("ans = %f ",a/b);
 puts("thank you !");
return 0;
}