Как убрать расширение файла из строки

Есть строка std::string path1 = "/home/igor/tmp.123.zip"
Нужно программно превратить ее в строку /home/igor/tmp.123
При этом алгоритм не должен трогать строки типа std::string path2 = "/home/igor/tmp.123"
Расширение файла задано в const std::string tail = ".zip";


Как сделать это максимально быстро?


Ответы (2 шт):

Автор решения: Harry

Убедиться, что конец строки совпадает с требуемым расширением, если да - убрать его.

Примерно так -

if (path1.size() < tail.size()) return;
if (path1.substr(path1.size()-tail.size(),tail.size())==tail)
{
    path1.erase(path1.size()-tail.size(),tail.size());
}

Если С++20 доступен - то можно проверить окончание с помощью ends_with().

Еще вариант - использовать path из <filesystem>, но по сути то же самое...

string path1 = "/home/igor/tmp.123.zip";
string tail = ".zip";
filesystem::path path2 = path1;

if (path2.extension() == tail)
    path2.replace_extension();

cout << path2;
→ Ссылка
Автор решения: Yakov
int main()
{
    std::string hello = "/home/igor/tmp.123.zip";
    const std::string tail = ".zip";
    size_t offset = hello.find_last_of(tail);
    if(offset != std::string::npos && offset == hello.length()-1)
    hello.erase(offset-tail.length()+1, tail.length());
    return 0;
}
→ Ссылка