2009-03-20 8 views
38

Sto usando std::string e devo lasciare il pad su una determinata larghezza. Qual è il modo consigliato per farlo in C++?Padding stl stringhe in C++

ingresso Esempio:

123 

pad a 10 caratteri.

uscita Esempio:

 123 

(7 spazi davanti 123)

risposta

50

std :: setw (setWidth) manipolatore

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

o

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

uscite imbottiti 77 e "hi".

se è necessario il risultato come stringa utilizzare l'istanza di std :: stringstream invece di std :: oggetto cout.

ps: file di intestazione responsabile <iomanip>

+0

yeah ora con l'esempio è molto più chiaro –

+0

risposta impressionante. Qualche possibilità di ottenere questo risultato sotto forma di un esempio di lavoro minimo? Grazie – puk

-3

Crea una nuova stringa di 10 spazi, e lavorare all'indietro in entrambi stringa.

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

Mi piace questa soluzione perché su vari SO Linux stream stream di stringhe richiede una dipendenza GLIBC che non è disponibile. –

+2

insert (0, ...) è una cattiva idea perché è lento, è necessario copiare la stringa ogni volta che si inserisce un nuovo carattere. – arhuaco

7

è possibile creare una stringa contenente N spazi chiamando

string(N, ' '); 

Così si potrebbe fare in questo modo:

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

C'è una bel modo semplice :)

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

sbagliato. deve essere 10 - lunghezza di 123 –

+0

Sì, ho interpretato erroneamente il requisito. fisso. –

1

ne dite:

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

è possibile utilizzarlo in questo modo:

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

Il modo più semplice che posso pensare sarebbe con uno stringstream:

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

foo ora dovrebbe essere riempito.

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