Несколько моментов: во-первых, использование strtok
- неопределенное поведение;в случае g ++ это может даже привести к очень странному поведению.Вы не можете изменить содержимое std::string
позади строк и ожидать, что это сойдет с рук.(Необходимость const_cast
должна была вас предупредить.)
Во-вторых, если вы собираетесь манипулировать именами файлов, я настоятельно рекомендую boost::filesystem
.Он знает все о таких вещах, как разделители путей и тому подобное, а также тот факт, что последний компонент пути обычно является специальным (поскольку это может быть имя файла, а не каталог).
В-третьих, если этопросто один из, или по какой-то другой причине вы не можете или не хотите использовать Boost:
std::string::const_iterator pivot
= std::find( s.rbegin(), s.rend(), '/' ).base();
даст вам итератор для первого символа после последнего '/', илидо первого символа в строке, если его нет.После этого просто использовать два конструктора итератора строки для получения двух компонентов:
std::string basename( pivot, s.end() );
std::string dirname( s.begin(), pivot == s.begin() ? pivot : pivot - 1 );
А если вам позже потребуется поддержка Windows, просто замените find
на:
static std::string const dirSeparators( "\\/" );
std::string::const_iterator pivot
= std::find_first_of( s.rbegin(), s.rend(),
dirSeparators.begin(), dirSeparators.end() );