【问题标题】:Splitting c array using strtok使用 strtok 拆分 c 数组
【发布时间】:2019-12-12 22:29:59
【问题描述】:

我正在制作一个自定义 C shell,目前使用空格分割命令:

(我目前正在做的简化示例)

char *buf[20];
char *tempVar;
tempvar = strtok(buf, " ");

例如:

sleep 5 将被拆分为 sleep5

但是,我也想拆分&(以创建后台进程)。所以sleep 5& 将被分成 3 个:sleep5&

任何帮助将不胜感激。

【问题讨论】:

  • 这听起来不像你可以用strtok() 完成的事情,而且你需要编写自己的标记器来检查输入流并返回接下来的任何内容,并酌情尊重空格,而且即使之前没有空格,也会抓住其他字符,例如&
  • 如果您要支持引号和转义等内容,无论如何您都需要一个更强大的词法分析器,最好直接从您自己的开始,而不是尝试使用strtok
  • strtok 与分隔符一起使用,因此它不适合此用例。自己解析行并做一些创造性的 sscanf() 摆弄可能是最简单的。
  • 使用size_t len = strlen(tempVar); if (len && tempVar[len-1] == '&') 添加一个检查然后你知道tempVar 中的最后一个字符是'&' 所以用0 覆盖它以在该点终止并添加一个额外的参数包含"&".

标签: c strtok


【解决方案1】:

您可以使用特定的方法来提取数字,或者直接删除字符&。我在这里有一个想法,也许这不是最好的解决方案。期待进一步交流。

char buf[] = "sleep 5&";
char *cmd;
char *arg;
char *tmpArg;
int count = 0;
while (true) {
    if (0 == count) {
        cmd = strtok(buf, " ");
        arg = strtok(NULL, " ");
    } else {
        cmd = strtok(NULL, " ");
        arg = strtok(NULL, " ");
    }
    printf("%s\n", cmd);

    if (NULL != cmd) {
        if (strcmp("sleep", cmd) == 0) {
            if (arg != NULL) {
                // 1. introduce a method to extract digit or
                // 2. using `&` to split the arg again, the shortcoming is that we omit character `&` here.
                for (int i = 0; i < 2; ++i) {
                    if (0 == i) {
                        tmpArg = strtok(arg, "&");
                    } else {
                        tmpArg = strtok(NULL, "&");
                    }
                    printf("%s\n", tmpArg);
                }
            }
        }
    } else {
        break;
    }
    ++count;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多