7

我想截断 cout 中的字符串,

string word = "Very long word";
int i = 1;
cout << word << " " << i;

我希望字符串的输出最多包含 8 个字母

所以就我而言,我想要

Very lon 1

代替 :

Very long word 1

我不想使用 wget(8) 函数,因为它不会将我的单词截断为我想要的大小。我也不希望“单词”字符串改变它的值(我只想向用户显示单词的一部分,但在我的变量中保持完整)

4

2 回答 2

4

我知道您已经有了解决方案,但我认为这值得一提:是的,您可以简单地使用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
于 2013-10-25T13:09:43.490 回答
1

正如Chris Olden上面提到的, usingstring::substr是一种截断字符串的方法。但是,如果您需要另一种方法来执行此操作,则可以简单地使用string::resize,然后在字符串被截断的情况下添加省略号。

你可能想知道是什么string::resize?实际上,它只是通过您的字符串调整已用内存(而不是保留的内存)的大小并删除超出新大小的任何字符,只保留字符串的第 n 个字符,其中 n 是新大小。此外,如果新的大小更大,它会扩展字符串的已用内存,但我认为这方面的扩展很简单。

当然,我不想建议一种“新的最佳方法”,它只是截断std::string.

如果您调整Chris Olden truncate 函数,您会得到如下内容:

#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;
}

我知道发布这个答案有点晚了。然而,它可能会为未来的访客派上用场。

于 2021-11-27T13:15:13.210 回答