#include <stdio.h>
#include <string.h> /* needed for strtok */
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv) {
        char text[10000];
    fgets(text, sizeof(text), stdin);
    char *t;
    int i;

    t = strtok(text, "\"\'| ");
    for (i=0; t != NULL; i++) {
        printf("token %d is \"%s\"\n", i, t);
        t = strtok(NULL, "\"\'| ");
    }
}

这是我试图使其分离标记的代码的一部分
假设输入'abc' "de f'g" hij| k "lm | no"
输出应该是
token 1: "abc"
token 2: "de f'g"
token 3: "hij"
token 4: "|"
token 5: "k"
token 6: "lm | no"

我得到了一些不同但很接近的东西,我可以把它改成这种格式吗?

最佳答案

你要做的基本上是一个解析器。strtok不是一个很好的工具,你可能会有更好的运气自己写。strtok基于这样一种假设,即限定令牌的任何内容都不重要,因此可以用'\0'覆盖。但你确实关心分隔符是什么。
唯一的问题是|语法。您希望将其用作标记分隔符和标记,这可能会使您的代码更复杂(但不会太复杂)。这里的问题是hij后面紧跟着|。如果终止hij以获取令牌,则必须覆盖|。您要么存储覆盖的字符并还原它,要么将字符串复制到其他地方。
你基本上有三种情况:
bar|是一个特殊的分隔符,也是一个标记;
引号分隔符"'匹配所有内容,直到下一个同类引号为止;
否则,标记由空白分隔。

08-26 05:12