2015-03-30 3 views
0

говорит, у меня есть 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.

+0

Windows осложняет жизнь ... обратная косая черта также является разделителем компонентов пути, и вы можете иметь «D:» в начале указать диск, не говоря уже о специальных именах, таких как «NUL:». Сколько вам нужно? Для POSIX ['basename()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/basename.html) верна. Он не будет заниматься расширением. Работа с базовым именем затруднительна (например, '/' требует специальной обработки, но не очень сложно. Что вы пробовали? Где у вас проблемы? –

+1

Как насчет нахождения последнего присутствия '/' и единственного присутствия '.' и взятия всего, что находится между этими позициями? – CinCout

+0

Я дам ему выстрел :) –

ответ

0

Для Windows взгляните на библиотечную функцию splitpath. См. splitpath (MSDN). Для вашего случая передайте NULL для «drive», «dir» и «ext», поскольку вам не нужны эти части.

Надеюсь, что это поможет.

+0

Так что я мог бы определить, что если на окнах использовать splitpath, если на linux использовать basename? –

+0

@ user3839220: Это, безусловно, вариант. Определите себе нейтральный интерфейс платформы для нужной вам функции, а затем реализуйте ее по-разному в POSIX и Windows. –

Смежные вопросы