2011-05-26 24 views
11

Quiero agregar una variable de cero inicial a una cadena. No pude encontrar nada en Google, sin que nadie mencione (s) printf, pero quiero hacer esto sin (s) printf.Agregar cero a la cadena, sin printf

¿Alguien de los lectores sabe de alguna manera?

+0

Un ejemplo sería bueno. –

+2

Varias respuestas hacen exactamente lo que ha pedido, pero ha dicho que no son lo que quería. Claramente, su pregunta está mal formulada (y no veo otra opción que votar en consecuencia). –

+0

@Jerry Lo siento mucho, hice mi mejor esfuerzo. Intentaré mejorar mis preguntas en el futuro. –

Respuesta

9
// assuming that `original_string` is of type `std:string`: 

std::string dest = std::string(number_of_zeros, '0').append(original_string); 
+8

¿Esto no solo agregará ceros sin tener en cuenta la longitud "original_string"? 'number_of_zeros = 4 original_string =" 99 " dest se convertirá en: 000099 (y no en 0099)'. Por favor corrígeme si estoy equivocado o quizás no entiendo lo que significa 'ceros iniciales' realmente ... – lepe

+0

@lepe Responde la pregunta tal como está escrita. Si el OP escribió lo que realmente querían decir es un asunto diferente. –

1
memcpy(target,'0',sizeof(target)); 
target[sizeof(target)-1] = 0; 

A continuación, pegue la cadena que desee con el prefijo cero al final del búfer.

Si es un número entero, recuerda log_base10(number)+1 (también conocido como ln(number)/ln(10)+1) te da la longitud del número.

+0

Nah, gracias por intentarlo pero quiero poder agregar una cantidad variable de cero. –

+0

@Guus: Ese * es * un número variable de ceros. Sin embargo, puedes reemplazar el (sizeof (target)) con algún otro número si te hace feliz. –

+0

@Guus: Específicamente, a partir de su comentario a continuación, quería% 05d, ¿verdad? Si el búfer tiene seis caracteres, eso es exactamente lo que mi código haría por usted (al menos la parte de relleno cero, dejando el número al final se dejó para usted). –

35

Usted podría utilizar std::string::insert, std::stringstream con stream manipulators, o Boost.Format:

#include <string> 
#include <iostream> 
#include <iomanip> 
#include <boost/format.hpp> 
#include <sstream> 

int main() { 
    std::string s("12"); 
    s.insert(0, 3, '0'); 
    std::cout << s << "\n"; 

    std::ostringstream ss; 
    ss << std::setw(5) << std::setfill('0') << 12 << "\n"; 
    std::string s2(ss.str()); 
    std::cout << s2; 

    boost::format fmt("%05d\n"); 
    fmt % 12; 
    std::string s3 = fmt.str(); 
    std::cout << s3; 
} 
+0

Una aplicación: para rellenar un número entero de 20 caracteres: 'auto padded = std :: to_string (num); padded.insert (0, 20U - std :: min (std :: string :: size_type (20), padded.length()), '0'); 'El' min' evita que se envuelva si la cadena están tratando de rellenar es demasiado largo. (20 caracteres no tendrán este problema para ningún entero por debajo de 64 bits). El lanzamiento a 'size_type' es necesario porque min se queja de discrepancias en algunas plataformas. – Eponymous

3

La forma en C++ de hacerlo es con setw, ios_base::width y setfill

#include <iostream> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
    const int a = 12; 
    const int b = 6; 

    cout << setw(width) << row * col; 
    cout << endl; 

    return 0; 
} 
+0

Nah, eso es casi lo mismo que sprintf, pero gracias por su entrada (: –

10

se podría hacer algo como:

std::cout << std::setw(5) << std::setfill('0') << 1; 

Esto debería imprimir 00001.

Tenga en cuenta, sin embargo, que el carácter de relleno es "adhesivo", por lo que cuando termine de usar relleno cero, tendrá que usar std::cout << std::setfill(' '); para obtener el comportamiento habitual nuevamente.

+0

Nah, gracias por su entrada, pero es la misma manera que con sprintf (: –

+1

no parece ser pegajoso. 'Std :: cout << std :: setw (5) << std :: setfill ('0') << 1 << 1 << std :: endl; 'produce:' 000011' –

+0

@AleksanderFular 'std :: setw' no es pegajoso. std :: setfill' es pegajoso, pero no es demasiado útil sin un ancho demasiado grande para darle algo que hacer. Por lo tanto, su primer '1' obtiene el' setw (5) 'y, por lo tanto, tiene los ceros al frente, pero luego el' setw 'se devuelve a su valor predeterminado, por lo que su segundo' 1' simplemente se imprime como '1'. Por lo tanto,' 00001' + '1' =' 000011'. El punto es que si luego configura 'setw', usted tendría encontrar que el caracter 'setfill' anterior todavía estaba en efecto, porque' setfill' no es pegajoso => ​​no se restablece a su valor predeterminado de un espacio. –

32

que puedo dar esta solución de una sola línea si desea que un campo de ceros n_zero:

std::string new_string = std::string(n_zero - old_string.length(), '0') + old_string; 

Por ejemplo: old_string = "45"; n_zero = 4; new_string = "0045";

+3

Me gusta esto. Significa que no tengo que construir un stringstream, que tiene bastante equipaje con respecto a los internos. – Robinson

+0

Perfecto, exactamente lo que estaba buscando. (y comentar arriba +1) – Kyslik

1

Esto funciona bien para mí. No es necesario cambiar setfill a '', ya que esta es una transmisión temporal.

std::string to_zero_lead(const int value, const unsigned precision) 
{ 
    std::ostringstream oss; 
    oss << std::setw(precision) << std::setfill('0') << value; 
    return oss.str(); 
} 
0

una línea, pero limitado a ints y 6 ceros al max:

int number = 42; 
int leading = 3; //6 at max 
std::to_string(number*0.000001).substr(8-leading); //="042" 

Run it

Cuestiones relacionadas