c++ - 删除 std::string_view 的最后一个字符
问题描述
我正在尝试删除 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]
. 如何删除尾随]
?
谢谢。
解决方案
如果将指向 char 的指针插入到字符流中,则会打印指向的字符串,直到到达空终止符。如果没有空终止符,则程序的行为是未定义的。
std::string_view
不保证为空终止。因此插入std::string_view::data
字符流是危险的。在这种特殊情况下,字符串视图指向空终止字符串中的非空终止子字符串,因此行为是明确定义的,但不是您想要的,因为输出将继续到子字符串的外部。
如何删除前面的 ] ?
将字符串视图返回到子字符串而不是指针:
constexpr std::string_view to_string() {
...
return str2;
}
推荐阅读
- select - 我可以在基于第三列拆分后写入特定列吗?
- javascript - 检测由于下载栏(chrome、latest edge、firefox)而导致的窗口调整大小与一般窗口调整大小
- javascript - 如果我们想在一行中插入多张通过拖放上传的图片,我们该怎么办?
- php - 在本地主机上的 Apache 中将根文件夹设置为子文件夹,这也将在生产服务器上工作
- python - 在 macos 上使用 python 2.7.10 的 Tkinter notebook 的不同选项卡中,滚动条无法正常工作
- python - 我可以将 django_rest 与 django-tenants 一起使用吗?
- python - 合并数据框并保留列?
- go - Golang fmt printf 右填充
- javascript - 为什么这种动态编程优化实际上会使代码变慢?
- javascript - 如何根据页面上输入的文字让对话气泡变大变小