如何将字符串分解为特定字符

  • 本文关键字:字符 分解 字符串 c
  • 更新时间 :
  • 英文 :


我想知道如何将字符串分解为特定的字符,而不仅仅是打印。一旦我把它分解成字符,我就需要把它存储在某个地方,并把它转换成不同的数据类型。例如,如果用户输入9*5cos(5(,我希望能够以一种可以在int中识别并执行该命令的方式将其分解。最好的方法是什么?这必须在C.中执行

如果你想把一个数学表达式分解成它的组成部分,那么你需要一个lexer和一个解析器。

词法分析或标记化是将字符串转换为解析器能够理解的标记的过程。解析器是将规则应用于令牌并获得结果的程序。所以,举个例子:

expr := 9 * 5 * cos(5)

我们有8个代币:

1. 9 - NUMBER
2. * - MULTIPLY 
3. 5 - NUMBER
4. * - MULTIPLY
5. cos - IDENTIFIER
6. ( - LEFT_PAREN
7. 5 - NUMBER
8. ) - RIGHT_PAREN

因此,lexer阶段的输出是一个令牌列表(就像上面的那个(。下一个阶段是解析器,它将读入令牌列表并应用规则。在数学中,我们有一些规则,比如";乘法优先于加法";,以及";函数优先于乘法";。因此,您可以构造一个解析器来求解方程——一个常见的解析器是递归下降解析器。

你还应该看看形式语法和扩展的巴克斯-诺尔形式

在C中,如果您只想根据固定的标记(比如空格字符(断开字符串,则可以使用strtok(3)

#include <string.h>
// char *strtok(char *restrict str, const char *restrict delim);
...
char *expr = "9 * 5 * cos(5)"
char *tok;
tok = strtok(expr, " ");
// tok == "9"
tok = strtok(NULL, " ");
// tok == "*"
tok = strtok(NULL, " ");
// tok == "5"
tok = strtok(NULL, " ");
// tok == "*"
tok = strtok(NULL, " ");
// tok == "cos(5)"
tok = strtok(NULL, " ");
//tok == NULL

最新更新