C - 将字符串&#34; mv <from> <分割为&#34;使用strtok by delimiter&#34; /&#34;

时间:2017-12-22 17:25:31

标签: c string delimiter strtok

我得到了一个不变形的输入。例如:

char * str =&#34; mv / Folder1 / folder 2 / f1 / Folder1 / folder 3&#34;

我需要拆分它,以便我最终得到两个分开的字符串

str1 == / Folder1 / folder 2 / f1

str2 == / Folder1 / folder 3

我尝试过使用strtok(str,&#34; /&#34;)但它不会工作。它忽略了空间 分隔符,只使用&#34; /&#34;。

有什么想法吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

传递给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;
    }
}