为什么我的' +'运营商被视为新线路角色?

时间:2014-12-05 19:47:24

标签: c newline user-input

以下代码适用于模块化计算器问题。输入数据是:

 5
+3
* 7
+10
* 2
* 3
+1
% 11
#include <stdio.h>

int main(void) {
    char oper;
    int number,result;
    scanf("%d",&number);
    result=number;
    do
    {
        oper=getchar();
        fflush(stdin);
        scanf("%d",&number);
        if(oper=='+')
        {
            result=result+number;
        }
        else if(oper=='*')
        {
            result=result*number;
        }
        printf("%c %d %d ",oper,number,result);
    }while(oper!='%');
    result=result%number;
    printf("%d",result);
    return 0;
}

我得到的输出如下:

3 5 
 3 5 * 7 35 
 10 35 
 10 35 * 2 70 
 2 70 * 3 210 
 1 210 
 1 210 % 11 210 1

我似乎无法弄明白为什么?

3 个答案:

答案 0 :(得分:1)

替换

oper=getchar();
fflush(stdin);
scanf("%d",&number);

scanf(" %c", &oper);
scanf("%d", &number);

答案 1 :(得分:1)

如果你写scanf(" %c", &operator)%c" %c"之前的空格会在阅读单个字符之前消耗任意数量的空白字符。

此外,scanf会在匹配失败时返回EOF。您可以将其用作while循环的条件。

还有一个建议:在执行操作之前,将result存储在previous变量中,以便您可以在操作之前和之后打印该值。这将导致用户友好的输出。

#include <stdio.h>

int main(void) {
  char operator;
  int number, previous, result;
  scanf("%d", &number);
  result = number;
  while (scanf(" %c", &operator) != EOF) {
    previous = result;
    scanf("%d", &number);
    if (operator == '+') {
      result += number;
    } else if (operator == '-') {
      result -= number;
    } else if (operator == '*') {
      result *= number;
    } else if (operator == '/') {
      result /= number;
    } else if (operator == '%') {
      result %= number;
    }
    printf("%d %c %d = %d\n", previous, operator, number, result);
  }
  return 0;
}

答案 2 :(得分:1)

一般情况下,我发现使用fgets()scanf() / getchar()更好(或者,如果您使用的是C99,gets_s() - 我仍然更喜欢{ {1}}以便为所有基于用户的输入提供对旧编译器环境的最大可移植性,然后在必要时使用fgets()sscanf()(等)将字符串转换为其他数据类型,因为这将以缓冲区安全的方式逐行读取数据,您不必担心输入缓冲区中剩余的内容。 对于基于用户的输入尤其如此,这种输入从来没有格式良好(由于拼写错误等)strtol()只有在阅读格式良好的输入文件时才能正常工作。

考虑到这一点,我会更像这样编写代码:

scanf()