@ Николай Хилюк предлагает лучшее решение, кроме.
1) Вернемся к использованию char *, абсолютно нет веских оснований для использования const.
2) Этот код не является переносимым и, вероятно, не будет работать ни в одной из систем POSIX, где /не является разделителем файловой системы в зависимости от реализации компилятора.Для некоторых компиляторов Windows вы можете захотеть проверить «\» вместо «/».Вы можете даже протестировать систему и установить разделитель на основе результатов.
Имя функции длинное, но описательное, проблем нет.Невозможно быть уверенным, что функция вернет имя файла, вы можете быть уверены, что это возможно, если функция закодирована правильно, чего вы добились.Хотя, если кто-то использует его в строке, которая не является путем, очевидно, он потерпит неудачу.Я бы, вероятно, назвал это basename, так как он сообщал бы многим программистам, какова его цель.Это всего лишь мое предпочтение, хотя, основываясь на моей предвзятости, твое имя в порядке.Насколько длина строки будет обрабатываться этой функцией и почему кто-то думал, что это будет точка?Вы вряд ли будете иметь дело с именем пути длиннее, чем то, что эта функция может обрабатывать в компиляторе ANSI C.Поскольку size_t определяется как длинное целое без знака, которое имеет диапазон от 0 до 4 294 967 295.
Я проверил вашу функцию следующим образом.
#include <stdio.h>
#include <string.h>
char* getFileNameFromPath(char* path);
int main(int argc, char *argv[])
{
char *fn;
fn = getFileNameFromPath(argv[0]);
printf("%s\n", fn);
return 0;
}
char* getFileNameFromPath(char* path)
{
for(size_t i = strlen(path) - 1; i; i--)
{
if (path[i] == '/')
{
return &path[i+1];
}
}
return path;
}
Отлично сработало, хотя Даниэль Камил Козар нашелошибка 1 off, которую я исправил выше.Ошибка будет отображаться только с неверно сформированным абсолютным путем, но, тем не менее, функция должна иметь возможность обрабатывать фиктивный ввод.Не слушайте всех, кто вас критикует.Некоторым людям просто нравится иметь мнение, даже когда оно ничего не стоит.
Мне не нравится решение strstr (), так как оно потерпит неудачу, если имя файла совпадает с именем каталога в пути, и даэто может происходить и происходит, особенно в системе POSIX, где исполняемые файлы часто не имеют расширения, по крайней мере, в первый раз, когда вам придется выполнять несколько тестов, а поиск разделителя с помощью strstr () становится еще более громоздким, посколькуспособ узнать, сколько разделителей может быть.Если вам интересно, почему человек хочет, чтобы базовое имя исполняемого файла Think busybox, egrep, fgrep и т. Д.
strrchar () было бы громоздким для реализации, так как он ищет символы, а не строки, поэтому яя не нахожу его почти таким же жизнеспособным или лаконичным, как это решение. Я исправлен Rad Lexus, это не было бы так громоздко, как я думал, так как strrchar () имеет побочный эффект от возвращения индекса строки за пределы найденного символа,
Береги себя