使用Scanf读入随机长度的等式

时间:2014-03-03 14:49:30

标签: c scanf

我试图在一个等式中读取,然后分别取出每个部分,然后用户可以输入他们喜欢的大或小等式(例如.3 + 7,2 + -9 + 8或甚至2)。我有这个,但它似乎没有工作。

printf("Please enter an equation\n");

scanf("%f", &num);
//printf("%f", num);


while ( num != '\n'){
scanf("%f", &num);
scanf("%c", &op);
//printf("%c  %f \n", op, num);
}

当我输出我得到的信息与输入信号不同时。

5 个答案:

答案 0 :(得分:1)

您可能希望阅读How to read a line from the console in C?了解完整详情,但基本上您只需执行此操作:

char * getline(void) {
    char * line = malloc(100), * linep = line;
    size_t lenmax = 100, len = lenmax;
    int c;

    if(line == NULL)
        return NULL;

    for(;;) {
        c = fgetc(stdin);
        if(c == EOF)
            break;

        if(--len == 0) {
            len = lenmax;
            char * linen = realloc(linep, lenmax *= 2);

            if(linen == NULL) {
                free(linep);
                return NULL;
            }
            line = linen + (line - linep);
            linep = linen;
        }

        if((*line++ = c) == '\n')
            break;
    }
    *line = '\0';
    return linep;
}

答案 1 :(得分:1)

您正在尝试在float变量中使用完整表达式(num,在您的代码中)。如果在while循环中执行scanf("%f", &num);,则只需覆盖num中的值。您需要将表达式放在char数组或char *中。然后你需要有一个algrithm来分隔运算符和数字,将数字转换为所需的类型并解决euation。

答案 2 :(得分:0)

如果你想阅读一个表达并让你的程序明白这一点,你需要更重的机器。要么这是XY problem,要么你需要重新思考问题并找到另一种方法;或者您应该查看整个解析/编译区域。

脚本语言(如Python或Perl)有一些eval内置函数,因此您可以将一段代码作为文本并进行评估(运行)。也许使用其中一个可以更好地匹配您的问题?但要小心,盲目地运行用户输入的任何内容都是巨大的风险......

答案 3 :(得分:0)

要使用scanf读取任意长度的行,可以使用

scanf("%[^\n]", equation);

这个正则表达式意味着“读取所有内容,直到找到'\ n'字符”。 请记住,这不安全,因为用户可以轻松地溢出“方程式”缓冲区。如果你想避免这种情况,我建议在循环中通过char读取char,如下所示:

for(i=0; i < MAX_EQ_SIZE; i++)
{
    char tmp;
    scanf("%c", &tmp);
    if(tmp == '\n') 
        break;
    equation[i] = tmp;
}

因为你问的是如何,所以我不打算解析读方程。 这是一个代码示例:

#include <stdio.h>

#define MAX_EQ_SIZE 1024

void parse(char * eq) 
{
    // Do the processing
}

int main()
{
    char equation[MAX_EQ_SIZE];
    scanf("%[^\n]", equation); // Read a whole line
    scanf("%*c"); // Read and ignore the \n

    puts(equation);

    parse(equation);
}

答案 4 :(得分:0)

使用fgets()读取输入行。
使用sscanf()的返回值来确定数字或运算符。

int Eval(void) {
  char buffer[100];
  char *p = buffer;
  printf("Please enter an equation\n");
  if (fgets(buffer, sizeof buffer, stdin) == NULL)
    return -1;  // no more input

  float num;
  char op;
  int n;

  while (*p) {
    if (sscanf(p, "%f %n", &num, &n) == 1) {
      printf("num %f\n", num);
      p += n;
    }
    if (sscanf(p, " %c %n", &op, &n) == 1) {
      printf("op %c\n", op);
      p += n;
    } else if (*p) {
      printf("Error '%s'\n", p);
      return 0;
    }
  }
  return 1;
}