【问题标题】:C - split the string "mv <from> <to>" using strtok by delimiter " /"C - 使用分隔符“/”使用strtok拆分字符串“mv <from> <to>”
【发布时间】:2017-12-22 17:25:31
【问题描述】:

我得到一个固定格式的输入。例如:

char* str = "mv /Folder1/文件夹 2/f1 /Folder1/文件夹 3"

我需要拆分它,以便我得到两个单独的字符串,

str1 == /Folder1/文件夹 2/f1

str2 == /Folder1/文件夹 3

我尝试过使用 strtok(str, " /") 但它不起作用。它忽略了空间 分隔符且仅使用“/”。

有什么想法吗?

非常感谢!

【问题讨论】:

  • 由于 strtok 删除了分隔符,使用斜杠作为分隔符是有缺陷的。看起来您需要在空格上进行拆分。就个人而言,我不喜欢 strtok,因为它会损坏输入,而且我通常宁愿我的输入没有被破坏。 YMMV。
  • 由于此问题当前标记为 C,并且建议的重复项严格为 C++,因此尚不清楚它是否匹配。

标签: c string delimiter strtok


【解决方案1】:

Here is a brief explanation of strtok. 当您传递“/”时,您告诉 strtok 在“/”或“”上进行拆分。实际上, strtok 可能不会轻易满足您的需求,因为它不会使用一对字符进行拆分,而是使用每个字符进行拆分。然后,您必须提供逻辑来重新组合在一起但其中有空间的拆分项目。您可以通过查找“/”中背靠背拆分字符导致的空令牌来做到这一点。这会告诉您您正处于新路径字符串的开头。但是,该解决方案不会很健壮,因为有人可以在 mv 之后放入双空格并破坏它。大多数工具要求您使用外部分隔符,例如引号或使用“\”作为文件名和路径的一部分。

【讨论】:

    【解决方案2】:

    您传递给strtok 的第二个字符串不是它搜索的模式——它是一组字符,它搜索该集中的任何一项。

    在这种情况下,我们需要搜索一种模式,因此我们可以使用(一种可能性)strstr 进行搜索:

    #include <string.h>
    #include <stdio.h>
    
    int main() {
        char* str = "mv /Folder1/folder 2/f1 /Folder1/folder 3";
    
        char *prev = strstr(str, " /");
        char *pos;
        while (NULL != prev) {
            pos = strstr(prev+1, " /");
            printf("%.*s\n", (int)(pos-prev), prev);
            prev = pos;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      相关资源
      最近更新 更多