使用strtok()定界路径

时间:2014-12-03 02:48:07

标签: c path strtok

我试图从路径中获取文件。 这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char split_path(char *path){

    char *str1, *delim;
    char buf[255];
    int i, max;

    char *token = "/";

    for (i = 1, str1 = path; ; i++, str1 = NULL){
        delim = strtok(str1, token);
        if (delim == NULL){
            break;
        }
        buf[i] = *delim;
        max = i;
    }

    char last = buf[max];

    return last;
}


int main(int argc, char *argv[]){

    if (argc != 3){
        fprintf(stderr, "Usage: %s string delim\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    char last = split_path(argv[1]);

    printf("%c\n", last);

    return 0;
}

因此,如果我输入/ a / b / c / d的输入,则返回&#39; d&#39;这就是我想要的。 但是如果我输入/a/b/c/d.txt的输入,它只返回&#39; d&#39;没有&#39; .txt&#39;,当我需要的是&#39; d.txt&#39;。 它似乎只是在最后一个/之后获得第一个索引。我似乎无法弄清问题。 非常感谢。

2 个答案:

答案 0 :(得分:0)

你的问题是split_path返回strtok的最后一个好结果的第一个字母。

更改split_path以返回一个字符串,并稍微修改它......如下所示:

    char *split_path(char *path){

    char *str1, *delim;
    int i, max;
    char *last = NULL;

    char *token = "/";

    for (i = 1, str1 = path; ; i++, str1 = NULL){
        delim = strtok(str1, token);
        if (delim == NULL){
            break;
        }
        last = delim;
    }

    return last;
}


int main(int argc, char *argv[]){

    if (argc != 3){
        fprintf(stderr, "Usage: %s string delim\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    char *last = split_path(argv[1]);

    printf("%s\n", last);

    return 0;
}

答案 1 :(得分:0)

我将告诉你如何以两种方式做到这一点。最简单的方法是包含libgen.h并使用basename(),如果您的系统上存在此问题。它做你想要的。但是如果你想编写自己的函数,你可以使用strrchr()来编写,它会在字符串中找到最后一个字符。

#include <stdio.h>
#include <string.h> // for strrchr()
#include <libgen.h> // for basename()

const char *my_basename(const char *path)
{
    const char *lastSlash = strrchr(path, '/');

    if (lastSlash)
        return lastSlash+1;
    return path;
}

int main(int argc, char *argv[])
{
    if (argc < 2)
        return;

    printf("Full path     = %s\n", argv[1]);
    printf("basename()    = %s\n", basename(argv[1]));
    printf("my_basename() = %s\n", my_basename(argv[1]));

    return 0;
}

示例输出:

Full path = /aaa/bbb/ccc/ddd.txt
Filename  = ddd.txt
Filename  = ddd.txt