删除 std::string_view 的最后一个字符
Posted
技术标签:
【中文标题】删除 std::string_view 的最后一个字符【英文标题】:Remove last character of std::string_view 【发布时间】:2020-04-08 16:15:58 【问题描述】:我正在尝试删除 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]
。如何删除尾随的]
?
谢谢。
【问题讨论】:
std::string_view::data()
不承诺以 null 结尾的 C 样式字符串。它只提供指向第一个字符的指针,长度丢失。
A likely duplicate
std::string_view
: "..指的是一个常量连续序列..." 来源:en.cppreference.com/w/cpp/string/basic_string_view
【参考方案1】:
如果将指向 char 的指针插入到字符流中,则会打印指向的字符串,直到到达空终止符。如果没有空终止符,则程序的行为是未定义的。
std::string_view
不保证为空终止。因此将std::string_view::data
插入字符流是很危险的。在这种特殊情况下,字符串视图指向空终止字符串中的非空终止子字符串,因此行为是明确定义的,但不是您想要的,因为输出将继续到子字符串的外部。
如何删除前置的 ] ?
将字符串视图返回到子字符串而不是指针:
constexpr std::string_view to_string()
...
return str2;
【讨论】:
以上是关于删除 std::string_view 的最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章
比较 std::string_view 和子字符串 string_view
除了 std::string_view 方法之外,std::string_view 比 char* 有啥优势吗?
为啥 std::string_view 比 const char* 快?
如何在 constexpr string_view 上使用 std::string_view::remove_prefix()