我试图从路径中获取文件。 这是我的代码:
#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;。 它似乎只是在最后一个/之后获得第一个索引。我似乎无法弄清问题。 非常感谢。
答案 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