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)
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)
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>
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;
}
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;
}
Ich mag diese Lösung, weil auf verschiedenen Linux OS Aromen Zeichenfolge Stream eine GLIBC Abhängigkeit benötigt, die nicht verfügbar ist. –
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
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; }
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, ' ');
falsch. muss 10 sein - Länge von 123 –
Ja, ich habe die Anforderung falsch gelesen. Fest. –
Wie wäre:
string s = " "; // 10 spaces
string n = "123";
n.length() <= 10 ? s.replace(10 - n.length(), n.length(), s) : s = n;
Sie können es wie folgt verwenden:
std::string s = "123";
s.insert(s.begin(), paddedLength - s.size(), ' ');
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.
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;
}
ja jetzt mit dem Beispiel ist es viel klarer –
Super Antwort. Eine Chance, das wir in Form eines minimalen Arbeitsbeispiels bekommen könnten? Danke – puk