正如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;
}
我知道现在回答有点晚了,但是对于未来的访问者可能会有所帮助。