Foros del Web » Programación para mayores de 30 ;) » C/C++ »

borrar cosas basura o inicializar una cadena con cosas nulas

Estas en el tema de borrar cosas basura o inicializar una cadena con cosas nulas en el foro de C/C++ en Foros del Web. HOLA!, Tengo este codigo para hacer, lo q hace es copiar una cantidad (cant) de caracteres de una cadena (cadena1) a otra cadena (cadena2) desde ...
  #1 (permalink)  
Antiguo 22/11/2014, 13:12
 
Fecha de Ingreso: agosto-2014
Mensajes: 35
Antigüedad: 10 años, 2 meses
Puntos: 0
Pregunta borrar cosas basura o inicializar una cadena con cosas nulas

HOLA!, Tengo este codigo para hacer, lo q hace es copiar una cantidad (cant) de caracteres de una cadena (cadena1) a otra cadena (cadena2) desde la posicion indicada (pos) (no debo usar una funcion de una biblioteca estandar ), entonces resulta q funciona solo q al final el puts de la funcion q hice, me devuelve obviamente una cadena (cadena2) con basura, mi pregunta es cual es la forma correcta de cargar esa cadena (cadena2) para q no muestre basura al final? como la inicializo? como se trabaja correctamente?

#include <stdio.h>
#include <string.h>
#define MAX 20
void copiar_cad(char cadena1[MAX],char cadena2[MAX],int pos,int cant);

int main(){
char cadena1[MAX], cadena2[MAX];
int pos, cant;


printf("Ingrese una cadena de caracteres: \n");
gets(cadena1);

printf("Ingrese el numero de posicion desde donde se va a copiar: \n");
scanf("%d", &pos);
printf("Ingrese la cantidad de caracteres que se van a copiar: \n");
scanf("%d", &cant);

copiar_cad(cadena1, cadena2, pos, cant);

return 0;
}

void copiar_cad(char cadena1[MAX],char cadena2[MAX],int pos,int cant){
int i;

for(i=0;i<cant;i++){
cadena2[i]=cadena1[pos-1];
pos++;
}

puts(cadena2);
}
  #2 (permalink)  
Antiguo 22/11/2014, 13:41
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: borrar cosas basura o inicializar una cadena con cosas nulas

Hay varias formas, truncando con un \0 (o varios \0) o usando memoria dinamica (para la memoria dinamica hasta donde yo se debes usar malloc - free que forma parte de la biblioteca estandar con lo cual no te soluciona el problema)

Supongamos que la fuente origen tiene 4 letras y solo copias 2, entonces te quedan 2 de basura en el destino. Lo solucionas rellenando todo el destino con 0 antes de comenzar a copiar, o bien añades un 0 despues del ultimo caracter. Si añades un 0 al final asegurate que hay espacio suficiente en el destino.

Espero que te sirva

Saludos
vosk
  #3 (permalink)  
Antiguo 24/11/2014, 02:02
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: borrar cosas basura o inicializar una cadena con cosas nulas

Cita:
Iniciado por vosk Ver Mensaje
Supongamos que la fuente origen tiene 4 letras y solo copias 2, entonces te quedan 2 de basura en el destino.
Eso no es del todo cierto.

Si tu tienes:

Código C++:
Ver original
  1. int main( void )
  2. {
  3.   const char* cadena1 = "Hola";
  4.   char cadena2[5];
  5.  
  6.   cadena2[ 0 ] = cadena1[ 0 ];
  7.   cadena2[ 1 ] = cadena1[ 1 ];
  8. }

e imprimes "cadena2" no tiene por qué imprimir 4 caracteres... sacará por pantalla basura hasta que encuentre un carácter nulo por el camino... aunque ello implique leer fuera de la memoria reservada para dicha variable.

Además, no hay ninguna imposición para que "cadena1" y "cadena2" tengan que tener el mismo tamaño. "cadena2" puede tener el tamaño que se desee ya que el único requisito que ha de cumplir es que su longitud mínima ha de permitir almacenar el string deseado.

Pasando ahora al tema de emmx2012, para finalizar un string simplemente has de incluir el carácter nulo '\0' al final de la cadena:

Código C++:
Ver original
  1. int main( void )
  2. {
  3.   const char* cadena1 = "Hola";
  4.   char cadena2[5];
  5.  
  6.   cadena2[ 0 ] = cadena1[ 0 ];
  7.   cadena2[ 1 ] = cadena1[ 1 ];
  8.   cadena2[ 2 ] = '\0'; // Finalizamos el string
  9.  
  10.   printf( "%s\n", cadena2 );
  11. }

Ten en cuenta que esto implica que si en una cadena quieres almacenar un string de 10 caracteres, necesitas que la cadena tenga al menos 11 caracteres de capacidad para poder añadir el carácter nulo.

Un saludo.
  #4 (permalink)  
Antiguo 25/11/2014, 02:58
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: borrar cosas basura o inicializar una cadena con cosas nulas

Cita:
Iniciado por eferion Ver Mensaje
Además, no hay ninguna imposición para que "cadena1" y "cadena2" tengan que tener el mismo tamaño.
Revisa el codigo propuesto por @emmx2012, pone claramente char cadena1[MAX], cadena2[MAX] ; siendo MAX = 20 entiendo que son del mismo tamaño.

Cita:
Iniciado por eferion Ver Mensaje
"cadena2" puede tener el tamaño que se desee ya que el único requisito que ha de cumplir es que su longitud mínima ha de permitir almacenar el string deseado
Estoy de acuerdo, y como hemos visto arriba tendran el mismo tamaño MAX; de todas formas repito: si no sabes el tamaño a copiar ¿cual será la longitud minima con la que a la vez puedes asegurar un minimo de datos basura? La misma que la fuente. Con esto quiero decir que no veo el objetivo de tu comentario.

Cita:
Iniciado por eferion Ver Mensaje
Si tu tienes:

Código C++:

Ver original

Código C:
Ver original
  1. int main( void )
  2.     {
  3.       const char* cadena1 = "Hola";
  4.       char cadena2[5];
  5.      
  6.       cadena2[ 0 ] = cadena1[ 0 ];
  7.       cadena2[ 1 ] = cadena1[ 1 ];
  8.     }




e imprimes "cadena2" no tiene por qué imprimir 4 caracteres... sacará por pantalla basura hasta que encuentre un carácter nulo por el camino...
Estoy de acuerdo, pero no se porque me lo comentas si en ningun sitio puse lo contrario.

De todas formas tu explicacion tampoco es del todo cierta: las funciones de volcado por pantalla no definen que es basura y que no. Con lo que te comenté anteriormente del tamaño necesario para copiar toda o parte de una cadena en otra sin memoria dinamica y sin saber la longitud a copiar, repito lo que puse en mi otro post: si tienes una fuente de 4 chars y copias 2 en destino (repito: de tambien 4 chars como capacidad minima), el resultado será que en destino te quedan 2 chars basura, independientemente de lo que te vaya a sacar printf; incluso rellenando los 2 chars sobrantes con 0 el resultado será que como minimo los siguientes chars al tamaño copiado sean basura.

@eferion espero que no tomes este post como critica, solo es una defensa de mi aportacion. De todas formas tu frase de "...Pasando ahora al tema de emmx2012..." me ha sentado como una desacreditacion o infravaloracion, algo como "dejemos las tonterias de vosk y pasemos a cosas importantes...". ¿A ti no? Si no es asi será una mala interpretacion por mi parte y pido disculpas.

Saludos
vosk


P.S.
Nota para los moderadores:

Ya se que este post no aporta nada al tema, solo me sirve para defender mi postura y aportacion al tema iniciado por @emmx2012. Si ven necesario borrarlo no tendre ningun problema en ello. Y dado que mi respuesta fue la misma que la de @eferion (la solucion de truncar con 0), si ven necesario borrar mi primer post tampoco tendré ningun problema en ello.

Saludos
vosk
  #5 (permalink)  
Antiguo 25/11/2014, 03:30
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: borrar cosas basura o inicializar una cadena con cosas nulas

Cita:
Iniciado por vosk Ver Mensaje
Revisa el codigo propuesto por @emmx2012, pone claramente char cadena1[MAX], cadena2[MAX] ; siendo MAX = 20 entiendo que son del mismo tamaño.
No me estaba refiriendo a esta práctica en concreto, sino en general. Lo mismo no supe expresarlo correctamente.

Cita:
Iniciado por vosk Ver Mensaje
Estoy de acuerdo, y como hemos visto arriba tendran el mismo tamaño MAX; de todas formas repito: si no sabes el tamaño a copiar ¿cual será la longitud minima con la que a la vez puedes asegurar un minimo de datos basura? La misma que la fuente. Con esto quiero decir que no veo el objetivo de tu comentario.
Esta frase estaba en la misma línea que la anterior, va todo seguido... es simplemente una aclaración de lo anterior. Obviamente si lo separas deja de tener sentido.

Cita:
Iniciado por vosk Ver Mensaje
Estoy de acuerdo, pero no se porque me lo comentas si en ningun sitio puse lo contrario.
El comentario se refería a tu frase "entonces te quedan 2 de basura en el destino". Mi intención era comentar el efecto que esa "basura" puede provocar en un programa... porque claro tu dices que se quedan dos caracteres "basura", pero el que esta aprendiendo verá que, tanto si imprime como si copia la cadena, obtendrá bastantes más de 2 caracteres de basura...

Escribí con prisa porque tenía poco tiempo, corregí varias cosas antes de mandar el mensaje y se ve que me quedó un tanto cojo. Lo siento.

Cita:
Iniciado por vosk Ver Mensaje
... el resultado será que como minimo los siguientes chars al tamaño copiado sean basura.
Ahí me he perdido... si tienes una cadena de longitud 4, copias 2 caracteres y en los dos restantes pones sendos nulos... ahí no hay basura. Lo mismo es que es primera hora de la mañana y no estoy fino.

Cita:
Iniciado por vosk Ver Mensaje
@eferion espero que no tomes este post como critica, solo es una defensa de mi aportacion.
Para nada me ofende... cada uno tiene su punto de vista y creo que es bastante productivo que cada uno pueda exponer el suyo... así cada uno puede sacar sus propias conclusiones.

Cita:
Iniciado por vosk Ver Mensaje
De todas formas tu frase de "...Pasando ahora al tema de emmx2012..." me ha sentado como una desacreditacion o infravaloracion, algo como "dejemos las tonterias de vosk y pasemos a cosas importantes...". ¿A ti no? Si no es asi será una mala interpretacion por mi parte y pido disculpas.
Siento mucho si se ha entendido así.

El texto en un foro es algo lineal y para cambiar de tema entiendo que hay que poner alguna coletilla o marcador que sirva para delimitar el texto que está relacionado entre sí.

Lo mismo podía haber usado la barra horizontal... pero no se, este foro va habilitando las opciones con el tiempo y yo soy bastante nuevo en el. Por ejemplo, no me ha dejado poner el enlace a las urls hasta hace relativamente poco. El problema es que lo mismo me habilita una característica y no me entero :(

Aún así, lo dicho, siento si mi comentario te ha parecido ofensivo, en ningún momento ha sido mi intención. Mis más sinceras disculpas.

Un saludo.
  #6 (permalink)  
Antiguo 25/11/2014, 05:42
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: borrar cosas basura o inicializar una cadena con cosas nulas

Cita:
..."dejemos las tonterias de vosk y pasemos a cosas importantes...". ¿A ti no?
¡Creo que no vosk! Le conozco de un año mas o menos, nunca le he visto faltar el respeto a nadie.
Poder debatir sobre programacion creo que es para mi la mejor forma de aprender. Sobre todo yo que me equivoco a todas las horas, si veen que digo boludeces por favor dame una torta.
Creo que podemos todos sacar mucho beneficio si hacemos "piña" de programadores como vosotros. Que dais un nivelazo al foro imprecionante.

Etiquetas: basura, cadena, char, cosas, funcion, inicializar, int, numero
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:24.