#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|
是一个特殊的分隔符,也是一个标记;
引号分隔符"
和'
匹配所有内容,直到下一个同类引号为止;
否则,标记由空白分隔。