2009-03-20 10 views
38

Ich benutze std::string und müssen sie auf eine bestimmte Breite auffüllen. Was ist die empfohlene Vorgehensweise in C++?Padding STL-Strings in C++

Probeneingabe:

123 

Pad zu 10 Zeichen.

Beispielausgabe:

 123 

(7 Plätze vor 123)

Antwort

50

std :: setw (SetWidth) Manipulator

std::cout << std::setw (10) << 77 << std::endl; 

oder

std::cout << std::setw (10) << "hi!" << std::endl; 

Ausgänge gepolstert 77 und "hallo!".

Wenn Sie das Ergebnis als Zeichenfolge benötigen, verwenden Sie stattdessen die Instanz std :: stringstream statt std :: cout object.

ps: verantwortlich Header-Datei <iomanip>

+0

ja jetzt mit dem Beispiel ist es viel klarer –

+0

Super Antwort. Eine Chance, das wir in Form eines minimalen Arbeitsbeispiels bekommen könnten? Danke – puk

-3

Erstellen eine neue Kette von 10 Leerzeichen und arbeitet nach hinten in beiden Strings.

string padstring(const string &source, size_t totalLength, char padChar) 
{ 
    if (source.length() >= totalLength) 
     return source; 

    string padded(totalLength, padChar); 
    string::const_reverse_iterator iSource = source.rbegin(); 
    string::reverse_iterator iPadded = padded.rbegin(); 
    for (;iSource != source.rend(); ++iSource, ++iPadded) 
     *iPadded = *iSource; 
    return padded; 
} 
29
void padTo(std::string &str, const size_t num, const char paddingChar = ' ') 
{ 
    if(num > str.size()) 
     str.insert(0, num - str.size(), paddingChar); 
} 

int main(int argc, char **argv) 
{ 
    std::string str = "abcd"; 
    padTo(str, 10); 
    return 0; 
} 
+0

Ich mag diese Lösung, weil auf verschiedenen Linux OS Aromen Zeichenfolge Stream eine GLIBC Abhängigkeit benötigt, die nicht verfügbar ist. –

+2

insert (0, ...) ist eine schlechte Idee, weil es langsam ist, müssen Sie die Zeichenfolge jedes Mal kopieren, wenn Sie ein neues Zeichen einfügen. – arhuaco

7

Sie

string(N, ' '); 

So könnte man tun, wie diese eine Zeichenfolge, die N Räume durch den Aufruf erstellen:

string to_be_padded = ...; 
if (to_be_padded.size() < 10) { 
    string padded(10 - to_be_padded.size(), ' '); 
    padded += to_be_padded; 
    return padded; 
} else { return to_be_padded; } 
2

Es gibt eine schöne und einfache Weise :)

const int required_pad = 10; 

std::string myString = "123"; 
size_t length = myString.length(); 

if (length < required_pad) 
    myString.insert(0, required_pad - length, ' '); 
+0

falsch. muss 10 sein - Länge von 123 –

+0

Ja, ich habe die Anforderung falsch gelesen. Fest. –

1

Wie wäre:

string s = "   "; // 10 spaces 
string n = "123"; 
n.length() <= 10 ? s.replace(10 - n.length(), n.length(), s) : s = n; 
17

Sie können es wie folgt verwenden:

std::string s = "123"; 
s.insert(s.begin(), paddedLength - s.size(), ' '); 
17

Der einfachste Weg, die ich denken kann, würde mit einem string sein:

string foo = "foo"; 
stringstream ss; 
ss << setw(10) << foo; 
foo = ss.str(); 

foo sollte jetzt gepolstert werden.

3
std::string pad_right(std::string const& str, size_t s) 
{ 
    if (str.size() < s) 
     return str + std::string(s-str.size(), ' '); 
    else 
     return str; 
} 

std::string pad_left(std::string const& str, size_t s) 
{ 
    if (str.size() < s) 
     return std::string(s-str.size(), ' ') + str; 
    else 
     return str; 
}