在标识符后拆分C字符串

时间:2014-12-11 01:14:50

标签: c parsing strtok

快速提问:我想在最后分割一个字符串文字(文件路径)“/”。

所以,从这个:"/folder/new/new2/new3" 结果如下:"/folder/new/new2"

基本上,我总是希望结果是提供的绝对路径后面的一个目录。

我一直在使用类似于此的strtok来获取最后一个目录,但我不知道一个简单的方法来获取倒数第二个目录。 :

    char *last
    char *tok = strtok(dirPath, "/");
    while (tok != NULL)
    {
         last=tok;
         tok = strtok(NULL, "/");
    }

3 个答案:

答案 0 :(得分:4)

在参考user3121023的建议时,我使用了strrchr,然后放置了一个空终结符来代替最后一次出现的“/".

char str[] = "/folder/cat/hat/mat/ran/fan";
char * pch;
pch=strrchr(str,'/');
printf ("Last occurence of '/' found at %d \n",pch-str+1);
str[pch-str] = '\0';
printf("%s",str);

这很好用,打印的结果是“/ folder / cat / hat / mat / ran”。

答案 1 :(得分:0)

哇我在直C上生锈了,但是好了。类似于现有代码的循环通过使用strstr而不是strtok来查找最后一个斜杠的位置。从那里开始,只需将字符串的一部分复制到斜杠即可。您也可以通过使用空终止符覆盖最后一个斜杠来更改dirPath,但这可能会导致内存泄漏(?),这取决于您的代码所做的其他操作...

// find last slash
char *position = strstr(dirPath, "/");
while (strstr(position, "/") != NULL)
{
    position = strstr(position, "/");
}

// now "position" points at the last slash character
if(position) {
    char *answer = malloc(position - dirPath); // difference in POINTERS
    strncpy(answer, dirPath, position - dirPath);
    answer[position - dirPath] = `\0`; // null-terminate the result
}

答案 2 :(得分:0)

我没有编译并运行它。只是为了好玩。

char* p = dirPath, *last = NULL;
for(; *p; p++)
{
   if (*p == '/')
      last = p;
}

if (last)
{
    *last = 0;
    puts(dirPath);
}