使用scanf解析c中的方程组

我需要解析用户的输入,这些输入可以是任意数量的变体:1 + 1 4(3-0)= x 1 *(3)-8

我如何使用scanf获取raw_input,然后拆分所有不同的值并告诉它是否是字符串,即x = – ()或int?

这就是我的想法

char * raw_input; scanf("%s",raw_input); 

它需要一个char数组,然后我只需要拆分并转换为单个元素。 做输入和(拆分和转换)的最佳方式是什么?

谢谢

如果您想编写自己的代码,最好的方法是以语法的forms定义表达式。 要轻松解析语法,最好将其简化。

例如,要解析像这样(1 +(3 * 4 + x)* y)+1的forms的表达式,你可以编写这样的语法:

 Expression -> Addition | null Addition -> Multiplication RestOfAddition RestOfAddition -> null | + Addition Multiplication -> Element RestOfMultiplication RestOfMultiplication -> null | * Element Element -> number | variable | ( Expression ) 

然后在你的程序中,对于这个语法中的每个非终端(在 – >左边的那个),你编写一个函数,如下所示:

 ExpTree *Expression(char *exp, int *position) { if (exp[*position]) { ExpTree *node = malloc(sizeof(*node)); node->type = LAMBDA; node->value = 0; return node; } else return Addition(exp, position); } ExpTree *Addition(char *exp, int *position) { ExpTree *node = malloc(sizeof(*node)); node->type = ADDITION; node->left = Multiplication(exp, position); node->right = RestOfAddition(exp, position); return node; } ExpTree *RestOfAddition(char *exp, int *position) { ExpTree *node; if (exp[*position] == '+') { ++*position; return Addition(exp, position); } else { ExpTree *node = malloc(sizeof(*node)); node->type = LAMBDA; node->value = 0; return node; } } 

类似地, MultiplicationRestOfMultiplication将被写为函数。

 ExpTree *Element(char *exp, int *position) { if (exp[*position] == '(') { ExpTree *node; ++*position; node = Expression(exp, position); if (!exp[*position] != ')') printf("Expected ) at position %d\n", *position); else ++*position; return node; } else if (exp[*position] == ')') { printf("Unexpected ) at position %d\n", *position); return NULL; } else if (exp[*position] >= '0' && exp[*position] <= '9') { ExpTree *node = malloc(sizeof(*node)); node->type = INTEGER; node->value = extract_int(exp, position); return node; } else if ((exp[*position] >= 'a' && exp[*position] <= 'z') || (exp[*position] >= 'A' && exp[*position] <= 'Z') || exp[*position] == '_') { ExpTree *node = malloc(sizeof(*node)); node->type = VARIABLE; node->value = extract_variable(exp, position); return node; } else { printf("Warning: unexpected character %c in location %d\n", exp[*position], *position); return NULL; } } 

其中extract_intextract_variable是两个接受表达式和位置的函数,当它们看到一个数字(或者extract_variable函数中的一个字母)时,继续从表达式字符串中构建数字(变量)并返回它,设置在他们完成之后的位置。

注意:这不是复制粘贴的代码。 它不完整,缺乏足够的错误检查。 一些细节已被省略,并作为解决方案提供,教授如何进行简单的解析而不是最简单的解决方案。

您可能需要对表达式进行标记 ,然后应用规则来确定表达式是否有效。

 char * raw_input; scanf("%s",raw_input); 

这绝对不正确。 raw_input是可以保存地址的指针。 它没有初始化,因此它指向垃圾或最坏似乎指向有效的内存位置。 您实际上无法将输入指向有效的内存位置,因此无法对其进行输入。

您需要malloc所需的字节并使raw_input指向它。 然后在这些内存位置上执行操作。

你需要一个词法分析器和一个解析器。 你可以尝试lex和yacc,或者他们的新同行flex和bison。

你可以使用:

  • flex,免费词法分析器。
  • 每串迭代器。 只需遍历所有字符串并选择所需的所有项目。 strtok()可能会对您有所帮助。 或者做一个大循环,然后只读取每个字符的内容,直到你拥有整个令牌。
  • 通过re2c的正则表达式(这是PHP使用的)

将字符串拆分为标记后,您需要解析它。 您将需要yacc或手工制作的解析器(通常是递归下降 )。

不要使用scanf 。 使用getchar并应用Shunting Yard算法 。

使用数组而不是指针。 如果你不能使用其他库,你可以查看侧cstring

但是你的情况会太长