C/Visual C - Basura en las cadenas de C

 
Vista:

Basura en las cadenas de C

Publicado por Alfredo Fernandez (7 intervenciones) el 28/02/2001 15:43:40
Voy a tratar de ser claro...
El tema es el siguiente con la siguiente sentencia trato de copiar una cadena a otra pero no esta funcionando bien porque en la cadena destino me aparece basura al final, con basura me refiero a caracteres extraños o bien caracteres que estaban la vez anterior que corri el programa. Es como si quedaran en memoria y las volviera a cargar cuando corro el programa otra vez.
Incluso con strcpy(NuevaLina,"") supuestamente pongo la cadena vacia pero cuando lo miro desde el compilador tiene toda esa basura.
Alguien tiene idea de que pasa o como puedo arreglar el codigo para que no pase.
Codigo:

strcpy(NuevaLinea," ");
w=0;
for(y=InicioLinea;y<=PosNuevaLinea;y++)
{
temp=Texto[y];
NuevaLinea[w]=temp;
w++;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Basura en las cadenas de C

Publicado por CaFcO (40 intervenciones) el 28/02/2001 16:58:40
Saludos, bien, algo muy importante de saber con respecto a las cadenas es que site pasas del limite establecido, estos pegan el contenido de las cadenas, tratare de explicarlo lo mas claro posible ok.

Por ejemplo cuando se declara una cadena lo podemos hacer de la siguiente manera:
char cad1[5]={"\0"},
cad2[5]={"\0"},
cad3[5]={"\0"};
/*con esto inicializas la cadena de manera que todas las posiciones tengan lo mismo*/

Supongamos que lo que quieres es leer la cadena, pues bien, como quiera que hagas la lectura de las cadenas el resultado podria ser de diferentes formas:

cad1=Hola menos de 5 caracteres
Cad2=Que tal mas de 5 caracteres
cad3=uno menos de 5 caracteres

Como veraz, esto podria ser lo que tu teclearas en un momento dado, pero es logico que despues de un printf tengas lo siguiente

Hola
Que tal
Que talUno

Esto es porque excedes el numero de espacios determinados para cada cadena y es por eso que se copia lo demas, lo que puedes hacer en estos casos es antes de que ocupes una cadena inicializarla, y esto lo puedes hacer desde la declaracion como esta en la parte superior o realizar un acceso por cada posicion de la cadena:

for (i=0; i<5; i++)
cad1[i]='\0';

para cada cadena y asi no corres el riesgo de que se copie basura, incluso con el strcpy, pero toma en cuenta que no debes de exceder las posiciones de la cadena a la hora de introducir los datos a las cadenas.

Bien espero te haya servido, si no, solo manda un mail y te explico, ok.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Basura en las cadenas de C

Publicado por Germán B. (143 intervenciones) el 01/03/2001 20:41:39
Creo que sé a qué te referís. La cosa es así: en C y C++ una cadena de caracteres es, como sabés, un array de caracteres, que si bien puede haber sido creado con un tamaño fijo, tiene una longitud lógica que es la del dato en sí.
La longitud del dato se determina por la posición donde está el "terminador", que es un carácter en cero binario '\0' (ascii 0). Lo que haya a la izquierda del terminador es el dato, y lo que haya a la derecha puede ser basura y es válido que lo sea. Si estás viendo al array como una cadena, lo que haya después del '\0' debe ser ignorado.
Cuando ponés strcpy(NuevaLinea,""), estás asignando el terminador a la primera posición (NuevaLinea[0]). Al resto del buffer NO LO ESTÁS TOCANDO. Y esa sería la basura que ves, pero no importa. El dato en sí está vacío porque lo primero que hay es un terminador. Si tu intención es que el buffer esté lleno de blancos, tenés que hacerlo de otra forma.
Ahora bien, si en el for estás copiando una cadena, la cadena original también podría tener un terminador antes de llegar al tope PosNuevaLinea, uno normalmente agregaría la condición de que la posición actual sea distinta a '\0'. Y por último, después del for asegurate de que la cadena final quede con un '\0' donde termina el dato en sí. Eso no haría falta si estuvieras usando strcpy(), sprintf(), etc., pero como estas asignando caracteres "a manopla", ocupate también vos del terminador. La ausencia del terminador en su lugar podría provocar que la basura que sobra forme parte del dato!
Si quedan dudas chiflá.
Saludos
G
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar