[ Foro de C++ ]

Copia de char de distinto tamaño. Me mete basura en el nuevo char.

17-Nov-2007 18:57
Homer A. Ramos
4 Respuestas

A ver si me explico bien:

Tengo una variable char[150] y necesito coger 'x' caracteres de ese char y guardarlos en un char[20]. Lo que he hecho para recorrer el char[150] ha sido un bucle que lea 'x' caracteres y los va copiando en chaar[20].

El problema es que, cuando esos 'x' caracteres son menores de 20, el char[20] a la hora de imprimir me imprime lo leído mas unos caracteres 'inventados' y sin sentido, por ejemplo:

- char[150] contiene: "HOY NO ME SALE NADA"
- Leo x=10 caracteres: "HOY NO ME "
- EL problema es que el char[20] me imprime: "HOY NO ME ????????,?"

Me mete caracteres sobrantes, ¿cómo los quito? Es que ya he intentado mil cosas y nada, siguen ahí esos caracteres 'raros'

Gracias por la ayuda!.

17-Nov-2007 19:00
Homer A. Ramos

Vaya por dios!

Solamente he probado a inicializar mi char cadena[20] = " " . Y todo arreglado, me he quitado los incómodos caracteres a la hora de imprimir.

Gracias!

21-Nov-2007 12:56
Nacho Cabanes (+84)

El problema era que estaba la cadena sin inicializar, sí, así que contenía basura, y no necesariamente un final de cadena correcto (\0).

Pero la solución que has dado quizá tampoco funcione siempre, porque típicamente cuando haces char cadena[20] = " ", el compilador guardará un carácter nulo en la primera posición, pero nada te garantiza que realmente toda la cadena esté rellena de caracteres nulos, por lo que se haces cadena[0]='h' puedes volver a tener problemas de que el carácter cadena[1] sea basura.

La única forma fiable de que la cadena sea correcta cuando la formas tú letra a letra es añadir el \0 al final: cadena[i+1]='\0';


02-Dec-2007 23:29
Sol enbum

El truco ese del \0 nunca falla ;)

He visto que en algunos casos es bueno copiar cadenas enteras con el comando strcpy de la libreria.

Sin embargo, en casos de que quiera unos determinados caracteres de una cadena no me convence el ir uno por uno (ej un caso de 1000 caracteres, copiar 750), no habría algun comando o alguna funcion especial para copiar de la cadena origen X-caracteres a otra cadena? Espero que se entienda ;)


03-Dec-2007 01:26
Nacho Cabanes (+84)

Sí, existe una forma de copiar "n" caracteres en vez de toda una cadena: no usar "strcpy" sino "strncpy" (que no garantiza que haya un carácter nulo al final).

Eso sí, ambas son funciones pensadas para cadenas "al estilo C", terminadas en carácter nulo, no para "strings" de C++.

Si usas strings, sería más razonable usar "substr" (que devuelve otro string) o "copy" (que vuelca a una cadena "al estilo C", y en el que tú tendrías que asegurarte nuevamente de que hay un carácter nulo en la última posición):

string subcadena = cadena.substr(10,5);

O bien

char destino[30];
memset( destino, '\0', 30 ); // Rellenamos con \0 la cadena de destino
cadena.copy( destino, 20 );






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)