Wie kann ich eine Zeichenfolge in C++ beliebig oft wiederholen?

Lesezeit: 4 Minuten

Ich möchte ‘n’ Leerzeichen (oder eine beliebige Zeichenfolge) am Anfang einer Zeichenfolge in C++ einfügen. Gibt es eine direkte Möglichkeit, dies entweder mit std::strings oder char*-Strings zu tun?

In Python könnten Sie zB einfach tun

>>> "." * 5 + "lolcat"
'.....lolcat'

  • Jemand eine Antwort mit QString?

    – Anonym

    12. Dezember 15 um 17:46 Uhr

Wie kann ich eine Zeichenfolge in C beliebig oft wiederholen
Lukas

Im besonderen Fall der Wiederholung eines einzelnen Zeichens können Sie verwenden std::string(size_type count, CharT ch):

std::string(5, '.') + "lolcat"

Dies kann nicht verwendet werden, um Zeichenfolgen mit mehreren Zeichen zu wiederholen.

  • Das OP bat darum, eine Zeichenfolge zu wiederholen, kein Zeichen.

    – Florian Kaufmann

    20. Januar 16 um 21:10 Uhr

Es gibt keine direkte idiomatische Möglichkeit, Zeichenfolgen in C++ zu wiederholen, die dem entsprechen * Operator in Python oder der x Operator in Perl. Wenn Sie ein einzelnes Zeichen wiederholen, funktioniert der Konstruktor mit zwei Argumenten (wie in den vorherigen Antworten vorgeschlagen) gut:

std::string(5, '.')

Dies ist ein erfundenes Beispiel dafür, wie Sie einen ostringstream verwenden könnten, um eine Zeichenfolge n-mal zu wiederholen:

#include <sstream>

std::string repeat(int n) {
    std::ostringstream os;
    for(int i = 0; i < n; i++)
        os << "repeat";
    return os.str();
}

Je nach Implementierung kann dies etwas effizienter sein, als die Zeichenfolge einfach n-mal zu verketten.

Verwenden Sie eine der Formen von string::insert:

std::string str("lolcat");
str.insert(0, 5, '.');

Dadurch wird “…..” (fünf Punkte) am Anfang der Zeichenfolge (Position 0) eingefügt.

  • Das OP bat darum, eine Zeichenfolge zu wiederholen, kein Zeichen.

    – Brent

    29. Dezember 17 um 19:45 Uhr

  • @Brent Das OP hat nach beiden gefragt – “‘n’ Leerzeichen (oder eine beliebige Zeichenfolge)” und demonstriert dann seine Absicht mit einem einzigen Punkt als Zeichenfolge. Englisch ist nicht die Muttersprache vieler Menschen, daher müssen Sie manchmal ihre genauen Anforderungen erraten, und bei der Analyse stellt sich die Frage wirklich, wie dies mit einem einzelnen Zeichen zu tun ist. Es tut mir leid, dass Sie meine Antwort nicht hilfreich genug fanden, dass Sie sie ablehnen mussten.

    – camh

    30. Dezember 17 um 7:10 Uhr

Ich weiß, dass dies eine alte Frage ist, aber ich wollte dasselbe tun und habe eine meiner Meinung nach einfachere Lösung gefunden. Es scheint, dass cout diese Funktion in cout.fill() integriert hat, siehe den Link für eine “vollständige” Erklärung

http://www.java-samples.com/showtutorial.php?tutorialid=458

cout.width(11);
cout.fill('.');
cout << "lolcat" << endl;

Ausgänge

.....lolcat

Für die Zwecke des vom OP bereitgestellten Beispiels ist der ctor von std::string ausreichend: std::string(5, '.'). Wenn jedoch jemand nach einer Funktion sucht, um std::string mehrmals zu wiederholen:

std::string repeat(const std::string& input, unsigned num)
{
    std::string ret;
    ret.reserve(input.size() * num);
    while (num--)
        ret += input;
    return ret;
}

Wie Commodore Jaeger anspielte, glaube ich nicht, dass eine der anderen Antworten diese Frage tatsächlich beantwortet. Die Frage fragt, wie man eine Zeichenfolge wiederholt, nicht ein Zeichen.

Die Antwort von Commodore ist zwar richtig, aber ziemlich ineffizient. Hier ist eine schnellere Implementierung, die Idee ist, Kopiervorgänge und Speicherzuweisungen zu minimieren, indem zuerst die Zeichenfolge exponentiell vergrößert wird:

#include <string>
#include <cstddef>

std::string repeat(std::string str, const std::size_t n)
{
    if (n == 0) {
        str.clear();
        str.shrink_to_fit();
        return str;
    } else if (n == 1 || str.empty()) {
        return str;
    }
    const auto period = str.size();
    if (period == 1) {
        str.append(n - 1, str.front());
        return str;
    }
    str.reserve(period * n);
    std::size_t m {2};
    for (; m < n; m *= 2) str += str;
    str.append(str.c_str(), (n - (m / 2)) * period);
    return str;
}

Wir können auch an definieren operator* um der Python-Version etwas näher zu kommen:

#include <utility>

std::string operator*(std::string str, std::size_t n)
{
    return repeat(std::move(str), n);
}

Auf meiner Maschine ist dies etwa 10x schneller als die Implementierung von Commodore und etwa 2x schneller als eine naive ‘n – 1 Mal anhängen’ Lösung.

1644073267 109 Wie kann ich eine Zeichenfolge in C beliebig oft wiederholen
HK-Junge

Sie sollten Ihren eigenen Stream-Manipulator schreiben

cout << multi(5) << "whatever" << "lolcat";

  • Das Schreiben eines Stream-Manipulators ist eine sehr komplizierte Art, etwas sehr Einfaches zu tun!

    – Null

    22. Dezember 14 um 3:39 Uhr

  • C++ ist eine sehr komplizierte Art, etwas sehr Einfaches zu tun.

    – JDPeckham

    02.09.17 um 20:20 Uhr


.

784540cookie-checkWie kann ich eine Zeichenfolge in C++ beliebig oft wiederholen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy