2009-03-20 15 views
38

estoy usando std::string y necesitan que se les pastilla izquierda a una anchura dada. ¿Cuál es la forma recomendada de hacer esto en C++?cadenas Relleno STL en C++

de entrada de la muestra:

123 

almohadilla a 10 caracteres.

Resultado de muestra:

 123 

(7 espacios en frente de 123)

Respuesta

50

std :: setw (setWidth) manipulador

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

o

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

salidas acolchado 77 y "¡Hola!".

si necesita resultar como ejemplo el uso de std :: string stringstream lugar std :: cout objeto.

ps: archivo de cabecera responsables <iomanip>

+0

sí ahora con el ejemplo es mucho más claro –

+0

Awesome answer. ¿Hay alguna posibilidad de que podamos obtener esto en la forma de un ejemplo de trabajo mínimo? Gracias – puk

-3

crear una nueva cadena de 10 espacios, y trabajar hacia atrás en tanto cadena.

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

me gusta esta solución porque en varias flujo de sabores de Linux OS cadena requiere una dependencia GLIBC que no está disponible. –

+2

inserto (0, ...) es una mala idea, ya que es lento, es necesario copiar la cadena cada vez que se inserta un nuevo carbón. – arhuaco

7

puede crear una cadena que contiene espacios N llamando

string(N, ' '); 

por lo que podría hacer como esto:

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

Hay una manera agradable y sencillo :)

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

mal. tienen que ser 10 - longitud de 123 –

+0

Sí, leí mal el requisito. fijo. –

1

¿Qué tal:

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

Usted puede utilizar de esta manera:

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

La forma más fácil se me ocurre sería con un stringstream:

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

foo ahora debería estar acolchado.

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