говорит, у меня есть sringУдаление расширений и каталогов из строки?
my/file/file.txt
Как бы я идти о зачистках косой черты и расширение просто file
? У меня есть google'd моя проблема, и люди предложили basename
, но я ищу что-то, что будет работать и на Windows, и на любые идеи?
Вот что я пытался:
char *rm_ext(char *file) {
char *retstr;
char *lastdot;
if (file == NULL)
return NULL;
if ((retstr = malloc (strlen (file) + 1)) == NULL)
return NULL;
strcpy (retstr, file);
lastdot = strrchr (retstr, '.');
if (lastdot != NULL)
*lastdot = '\0';
return retstr;
}
char *get_file_name(char *path) {
char *s = strrchr(path, '/');
if (!s) return rm_ext(strdup(path));
char *res = strdup(s + 1);
char *res_no_ext = rm_ext(result);
return res_no_ext;
}
Это работает, но не с D:/
или двойными косыми чертами, и я думаю, что это дает мне утечку памяти, так как есть куча скрытых mallocs из strdup.
Windows осложняет жизнь ... обратная косая черта также является разделителем компонентов пути, и вы можете иметь «D:» в начале указать диск, не говоря уже о специальных именах, таких как «NUL:». Сколько вам нужно? Для POSIX ['basename()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/basename.html) верна. Он не будет заниматься расширением. Работа с базовым именем затруднительна (например, '/' требует специальной обработки, но не очень сложно. Что вы пробовали? Где у вас проблемы? –
Как насчет нахождения последнего присутствия '/' и единственного присутствия '.' и взятия всего, что находится между этими позициями? – CinCout
Я дам ему выстрел :) –