如何截断字符串 [格式化] ?C++
How to truncate a string [formating] ? c++
我想截断cout中的字符串,
string word = "Very long word";
int i = 1;
cout << word << " " << i;
我想将最多 8 个字母作为字符串的输出
所以就我而言,我想拥有
Very lon 1
而不是:
Very long word 1
我不想使用 wget(8) 函数, 因为不幸的是,它不会将我的单词截断到我想要的大小。我也不希望"word"字符串更改其值(我只想向用户显示单词的一部分,但将其保留在我的变量中)
你已经有一个解决方案,但我认为这值得一提:是的,你可以简单地使用 string::substr
,但通常的做法是使用省略号来指示字符串已被截断。
如果这是您想要合并的内容,您可以制作一个简单的截断函数。
#include <iostream>
#include <string>
std::string truncate(std::string str, size_t width, bool show_ellipsis=true)
{
if (str.length() > width)
if (show_ellipsis)
return str.substr(0, width) + "...";
else
return str.substr(0, width);
return str;
}
int main()
{
std::string str = "Very long string";
int i = 1;
std::cout << truncate(str, 8) << "t" << i << std::endl;
std::cout << truncate(str, 8, false) << "t" << i << std::endl;
return 0;
}
输出将是:
Very lon... 1
Very lon 1
正如 Chris Olden 上面提到的,使用 string::substr
是一种截断字符串的方法。但是,如果您需要另一种方法来执行此操作,您可以简单地使用 string::resize
,然后在字符串被截断时添加省略号。
你可能想知道string::resize
是什么?实际上,它只是通过字符串调整已用内存(而不是保留内存)的大小,并删除超出新大小的任何字符,仅保留字符串的前n个字符,其中n是新大小。此外,如果新的大小更大,它将扩展字符串的已用内存,但我认为扩展的这一方面很简单。
当然,我不想建议一种"新的最佳方法"来做到这一点,这只是截断std::string
的另一种方法。
如果你改编 Chris Olden 截断函数,你会得到这样的结果:
#include <iostream>
#include <string>
std::string& truncate(std::string& str, size_t width, bool show_ellipsis=true) {
if (str.length() > width) {
if (show_ellipsis) {
str.resize(width);
return str.append("...");
}
else {
str.resize(width);
return str;
}
}
return str;
}
int main() {
std::string str = "Very long string";
int i = 1;
std::cout << truncate(str, 8) << "t" << i << std::endl;
std::cout << truncate(str, 8, false) << "t" << i << std::endl;
return 0;
}
尽管此方法执行基本相同的操作,但请注意,此方法获取并返回对修改后的字符串的引用,因此请小心使用,因为此字符串可能会由于代码中的外部事件而被销毁。因此,如果您不想冒这个风险,只需删除引用,函数就会变成:
std::string truncate(std::string str, size_t width, bool show_ellipsis=true) {
if (str.length() > width) {
if (show_ellipsis) {
str.resize(width);
return str + "...";
}
else {
str.resize(width);
return str;
}
}
return str;
}
我知道现在发布这个答案有点晚了。但是,对于未来的访问者来说,它可能会派上用场。
- C++格式化输出问题
- 格式化浮点值:返回默认值
- 自动格式化程序> >更改为>>
- 如何从C++中的格式化字符串派生整数?
- 将从格式化文本文件读取的文本数据存储到链表
- 在不使用系统的情况下从C++应用程序格式化 Linux 中的 SD 卡
- 高精度双精度的 Sprintf 格式化问题
- 如何在 c++ 中格式化和访问 2D 矢量数组中的数据
- 叮当格式化程序多行格式配置错误
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 从函数(不抛出函数)返回异常以进行消息格式化?
- 从格式化输入操作中获取读取字符数
- 如何从标准输入中检测格式化输入错误?
- 无法从 spdlog 中格式化参数
- 格式化时间 c++ dd/mm/yyyy hh:ss.
- 如何正确格式化csv文件?
- 格式化sqlite3_exec结果
- 使用 std::locale 格式化法语数字时无效的 UTF-8 数据
- C++逐步格式化字符串
- 如何使用 clang 格式格式化地图初始化?