2011-06-12 4 views

Respuesta

6

No hay estándar y rápido forma de hacerlo. Puedo pensar en algunas opciones.


supongamos que tenemos:

char *text = new char[20]; 
cin >> text; 

Nota - nos necesidad que sabemos que la capacidad es de 20! Te recomendaría usar alguna constante para esto, especialmente si esto también se usará para otras cadenas.


Vale, primera opción - utilizar std::stringstream

std::stringstream ss; 
ss << setw(20 - 1) << setfill('-') << text; 
//   ^^^^ we need one byte for the '\0' char at the end 
ss >> text; 

Pero esto es bastante lento.


llenar los caracteres a mano:

int length = strlen(text); 
for(int i = length; i < 20 - 1; ++i) // again - "20-1" - '\0' 
{ 
    text[ i ] = '-'; 
} 
text[ 20 - 1 ] = '\0'; // don't forget to NULL-terminate the string 

Y la mejor manera, en mi opinión - deshacerse de estos char* cosas (que ha marcado la pregunta ) y solo use std::string.

std::string sText; 
std::cin >> sText; 
sText.resize(20, '-'); // NOTE - no need to NULL-terminate anything 

Voilà! (:

De esta manera es mucho más clara y que no es necesario para llevar sobre el uso de delete[] text; al final (que no es tan trivial, a veces, sobre todo en caso de alguna excepción antes delete[] - esto le dará 100 la memoria% de fugas. por supuesto, siempre se puede utilizar punteros inteligentes .. pero punteros inteligentes para esto ?! :))


por supuesto, se puede escribir en lugar de 1920-1, sólo quería "resalte" -1, en caso de que use alguna constante.

+0

Si quisiera resaltar el '-1', ¿por qué no simplemente usar una constante en lugar de' 20'? :) Números mágicos ftl. – Xeo

+0

Porque si este tamaño no se usará más, no hay necesidad de agregar constante para 2-3 líneas de código (que _ son_ una después de la otra). O al menos, no lo haría. Tenga en cuenta que ya le aconsejé a @Ata que use la constante en el otro caso. –

0

Puede hacerlo de varias formas. Por ejemplo, suponga que tiene una cadena completa de 19 "-": (nota que defina la matriz con 20, sólo se puede obtener 19 personajes reales más la final \0:

const char* dashes = "--------------------"; 

Entonces se lee la cadena como se escribe:

char *text = new char[20] ; 
cin >> text ; 

y luego se puede utilizar para copiar strcat el resto de los personajes, utilizando strlen para determinar la longitud de la cadena de lectura:

strcat(text, dashes + strlen(text)); 

Esto agregará el 19 - length of the text en reposo al texto. Tenga en cuenta que agrego esa cantidad en particular al puntero dashes. Por favor, >> solo leerá una palabra. Para leer la línea completa de entrada, debe usar getline.

+0

-1: esto hace una asignación dinámica innecesaria y la aritmética del puntero se basa en un modismo algo complicado. Sería más sencillo copiar los guiones en el búfer y luego leer los primeros. –

+0

@Karl: tiene razón acerca de la asignación dinámica innecesaria, pero este era el código original. Solo escribí cómo completarlo. Tricky idioma en punteros? No creo que agregar un puntero a un valor sea tan complicado en absoluto. La copia del búfer primero también no funciona porque el cin pone un '' \ 0'' final al final de la entrada del usuario que debe eliminar (y * que * sería complicado). –

2

Ninguno de ustedes ha dicho nada sobre null terminator character - '\ 0'. Es realmente importante cuando se trabaja con cadenas en C/C++. Por ejemplo, si desea que su texto tenga 20 símbolos, debe asignar memoria para 21 caracteres. Esto es solo para información de Ata. Y la respuesta a su pregunta es:

char *text = new char[21]; 
//start initialization 
for (int i=0;i<20;i++) { 
    text[i] = '-'; 
} 
text[20] = '\0'; 
//end initialization 
cout << "Your input: " << endl; 
cin >> text;//get the user input 
text[strlen(text)]='-';//change the automatically added '\0' with '-' 
cout << text << endl; 

Tenga en cuenta que también debe comprobar si el usuario no ha introducido algo más larga que la memoria que ha asignado.


EDIT: Bueno, Kiril fue más rápido (y más precisa) que yo. :)

+0

¿Estás seguro de que 'std :: cin' _no tocará el resto de los caracteres? Pensé en esta opción al principio, pero no estaba seguro de si el estándar garantiza el comportamiento de 'std :: cin' en este caso. –

+0

De acuerdo con esta [declaración] (http://stackoverflow.com/questions/805403/what-are-the-rules-of-the-stdcin-object-in-c) leerá hasta el primer carácter de espacio en blanco, así que creo que todo estará bien. Pero tu pregunta es razonable. –

+0

Es interesante si esto está garantizado por el estándar:? Pero buena referencia. +1 de mí :) Por cierto, un poco fuera de tema - ¿cuál es tu DSLR: D –

Cuestiones relacionadas