有没有办法隐藏一个字符串并将其放入如下数组中:

y = sin(log(tan(x)))->{"y", "=", "sin", "(", ...}

没有空格的问题如下:sin(x)=sin ( x )

以下是我的代码:

bool firstDone = 0;
char strr[][4] = { "sin", "cos", "(", ")", "x" };
char str[] = "sin(cos(x))", st[7][5];

for (int i = 0; i < 4; i++) {
    if (!firstDone) {
        if (strlen(strtok(str, strr[i])) < 4) {
            strcpy(st[i], strtok(str, strr[i]));
            firstDone = 1;
        }
    }
    if (firstDone) {
        if (strlen(strtok(NULL, strr[i])) < 4) {
            strcpy(st[i], strtok(NULL, strr[i]));
        }
    }

}
for (int i = 0; i < 7; i++) {
    printf("%s, ", st[i]);
}

推荐答案

是的,这叫做符号化.

您可以用C实现一个,如下所示:

#include <ctype.h>
#include <stdio.h>

static void print_string(const char *begin, const char *end) {
  for (; begin != end; ++begin) {
    putchar(*begin);
  }
}

static void print_tokens(const char *s) {
  const char *p;
  while (*s != '\0') {
    if (isspace(*s)) {
      ++s;
    } else if (isalpha(*s)) {
      for (p = s; isalpha(*s); ++s) {}
      print_string(p, s);
      putchar('\n');
    } else {
      putchar(*s);
      putchar('\n');
      ++s;
    }
  }
}

int main(int argc, char **argv) {
  (void)argc; (void)argv;
  print_tokens("sin(log  (tan(x)))");
  return 0;
}

输出:

sin
(
log
(
tan
(
x
)
)
)

许多用C编写的编译器和解释器都有一个与上面类似的记号赋予器.

另一种方法是使用getc(3)从文件中读取输入.在这种情况下,ungetc(3)函数对于将一个字节放回输入很有用,例如,当我们计算出sin后面的(不是字母时,我们可以将它ungetc返回到输入,以便下一次循环迭代将处理它.

其他一些编译器和解释器使用正则表达式进行标记化,即每种标记类型都被指定为regexp.在您的例子中,正则表达式应该是\s+[a-zA-Z]+[^\sa-zA-Z].Unix工具lex及其GNU实现flex(1)(manual)可用于将这些正则表达式编译成C.

C++相关问答推荐

C中空终止符后面的数字?

如何解决C中的严格别名?

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

正在try 将文件/文件夹名从目录 struct 存储到链接列表

将 struct 变量赋给自身(通过指针取消引用)是否定义了行为?

将常量转换为指针会增加.数据大小增加1000字节

在C++中通过空指针隐式访问常量变量的值

为什么我不能只在内存地址中添加一个int来寻址任何数组?

进程已完成,退出代码为138 Clion

判断X宏的空性

为什么用非常数指针变量改变常量静态变量时会出现分段错误?

从C文件中删除注释

在C中使用无符号整数模拟有符号整数

分支预测和UB(未定义的行为)

C 语言中 CORDIC 对数的问题

函数指针作为函数参数 - 应该使用 const 吗?

如何在 C 中编辑 struct 体中的多个变量

将字节/字符序列写入标准输出的最简单形式

Codewars Kata 掷骰子的不稳定行为

c 函数指针,另一种语法