如何截断字符串 [格式化] ?C++

How to truncate a string [formating] ? c++

本文关键字:C++ 格式化 何截断 字符串      更新时间:2023-10-16

我想截断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;
}

我知道现在发布这个答案有点晚了。但是,对于未来的访问者来说,它可能会派上用场。