2009-03-20 14 views
38

Używam std::string i muszę zostawić je do podanej szerokości. Jaki jest zalecany sposób zrobienia tego w C++?Obcinanie łańcuchów stl w C++

Wejście próbki:

123 

pad do 10 znaków.

Przykładowe wyjście:

 123 

(7 obowiązuje przed 123)

Odpowiedz

50

std :: setw (setwidth) manipulatora

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

lub

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

usztywniane wyjścia 77 i "m".

jeśli potrzebujesz wyniku jako ciągu użyj instancji std :: stringstream zamiast std :: cout object.

ps: odpowiedzialny plik header <iomanip>

+0

Tak, teraz z przykładem jest o wiele jaśniejszy –

+0

Niesamowita odpowiedź. Czy istnieje szansa, że ​​uda nam się to uzyskać w postaci minimalnego przykładu roboczego? Dzięki – puk

-3

Utwórz nowy ciąg 10 miejsc, a działa wstecz zarówno łańcucha.

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

Podoba mi się to rozwiązanie, ponieważ na różnych strumieniach linuksowych smaków strumienia ciąg wymaga nieistniejącej zależności GLIBC. –

+2

insert (0, ...) jest złym pomysłem, ponieważ jest wolny, musisz skopiować ciąg za każdym wstawieniem nowego znaku. – arhuaco

7

można utworzyć ciąg zawierający spacje N wywołując

string(N, ' '); 

Więc można zrobić tak:

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

Jest miła i prosta droga :)

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

źle. musi być 10 - długość 123 –

+0

Tak, źle odczytałem wymóg. naprawiony. –

1

Jak o:

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

Można go używać tak:

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

Najłatwiej można myślę, byłoby z stringstream:

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

foo powinien być teraz wyściełany.

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