Удалить последний символ std :: string_view - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь удалить последний символ представления строки std, но независимо от того, что я делаю, он остается там. Я думаю, потому что я случайно удаляю "/ 0" вместо желаемого "]".

Вот мой код:

#include <iostream>
#include <tstr/tstring.h>
#include <cstring>

template<typename Class>
constexpr const char* to_string() {
    std::string_view str = __PRETTY_FUNCTION__;
    auto first = str.find("= ");
    auto last = str.find("]");
    auto str2 = str.substr(first + 2, last - first + 1);
    return str2.data();
}

class Foo {};

int main()
{
    std::cout << to_string<Foo>() << std::endl;
    return 0;
}

Это выводит Foo]. Как я могу удалить добавление ]?

Спасибо.

1 Ответ

3 голосов
/ 08 апреля 2020

Если вы вставите указатель на символ в поток символов, указанная строка будет напечатана, пока не будет достигнут нулевой терминатор. Если нет нулевого терминатора, то поведение программы не определено.

std::string_view не гарантирует нулевого завершения. Поэтому вставлять std::string_view::data в поток символов опасно. В этом конкретном случае строковое представление указывает на ненулевую завершающуюся подстроку в нулевой завершенной строке, поэтому поведение хорошо определено, но не то, что вы предполагали, поскольку вывод будет продолжаться за пределами подстроки.

Как я могу удалить предшествующий]?

Вернуть строковый вид в подстроку, а не в указатель:

constexpr std::string_view to_string() {
    ...
    return str2;
}
...