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

un struct imprime mas de lo permitido

Estas en el tema de un struct imprime mas de lo permitido en el foro de C/C++ en Foros del Web. pues este es el codigo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original #include<stdio.h>   struct agenda {         char nombre [ 30 ] ...
  #1 (permalink)  
Antiguo 26/02/2010, 09:52
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 2
un struct imprime mas de lo permitido

pues este es el codigo:

Código C:
Ver original
  1. #include<stdio.h>
  2.  
  3. struct agenda{
  4.         char nombre[30];
  5.         char telefono[9];
  6.     } agenda;
  7.  
  8. int main()
  9. {
  10.    
  11.    
  12.     printf("introduce el nombre:\n");
  13.      scanf("%s", &agenda.nombre);
  14.      printf("introduce el telefono:\n");
  15.      scanf("%s", &agenda.telefono);
  16.      printf("el nombre es %s y el telefono %s\n", agenda.nombre, agenda.telefono);
  17.      
  18.      return 0;
  19.      
  20. }

cuando lo ejeguto y meto un nº de telefono de mas de diez(numeros) no me da ningun problema al imprimirlo, ¿por que?
  #2 (permalink)  
Antiguo 26/02/2010, 12:34
 
Fecha de Ingreso: febrero-2010
Mensajes: 39
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: un struct imprime mas de lo permitido

esta mal en esto
scanf("%s", &agenda.nombre);

no tienes que poner el "&", siempre que pasas un array por parámetros siempre estas pasando la dirección de memoria del primer elemento
eso significa que puedes hacerlo así:
scanf("%s", agenda.nombre);

o así:

scanf("%s", &agenda.nombre[0]);

los dos resultan en lo mismo
  #3 (permalink)  
Antiguo 26/02/2010, 17:55
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 2
Respuesta: un struct imprime mas de lo permitido

me lo sigue imprimiendo, de todas formas gracias
  #4 (permalink)  
Antiguo 26/02/2010, 18:01
 
Fecha de Ingreso: febrero-2010
Mensajes: 39
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: un struct imprime mas de lo permitido

¿es tan difícil de explicar?

Código C++:
Ver original
  1. #include<stdio.h>
  2.  
  3. struct agenda{
  4.         char nombre[30];
  5.         char telefono[9];
  6.     } agenda;
  7.  
  8. int main()
  9. {
  10.    
  11.    
  12.     printf("introduce el nombre:\n");
  13.     scanf("%s", agenda.nombre);
  14.     printf("introduce el telefono:\n");
  15.     scanf("%s", agenda.telefono);
  16.     printf("el nombre es %s y el telefono %s\n", agenda.nombre, agenda.telefono);
  17.      
  18.     return 0;
  19.      
  20. }
  #5 (permalink)  
Antiguo 26/02/2010, 18:06
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 2
Respuesta: un struct imprime mas de lo permitido

es que ese es el codigo que tengo ahora y sigue sin funcionar
  #6 (permalink)  
Antiguo 26/02/2010, 18:07
 
Fecha de Ingreso: febrero-2010
Mensajes: 39
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: un struct imprime mas de lo permitido

a mi me funciona perfectamente, ¿donde esta el error?, ¿seguro que ya probaste compilar íntegramente el código que puse?
  #7 (permalink)  
Antiguo 26/02/2010, 18:09
 
Fecha de Ingreso: febrero-2010
Mensajes: 39
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: un struct imprime mas de lo permitido

scanf("%s", &agenda.nombre);
scanf("%s", &agenda.telefono);

solo cámbialos por

scanf("%s", agenda.nombre);
scanf("%s", agenda.telefono);
  #8 (permalink)  
Antiguo 26/02/2010, 18:19
 
Fecha de Ingreso: febrero-2010
Mensajes: 39
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: un struct imprime mas de lo permitido

=O, ya entiendo el "problema", disculpa, entendí mal la pregunta
  #9 (permalink)  
Antiguo 26/02/2010, 18:24
 
Fecha de Ingreso: febrero-2010
Mensajes: 39
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: un struct imprime mas de lo permitido

creo que es por que en la estructura realmente no estas creando dos char de [30] y [9] realmente solo estas creando un puntero, lo que hiciste es lo mismo que hacer:

Código C++:
Ver original
  1. struct agenda{
  2.         char nombre[];
  3.         char telefono[];
  4.     } agenda;


o lo mismo que

Código C++:
Ver original
  1. struct agenda{
  2.         char *nombre;
  3.         char *telefono;
  4.     } agenda;
  #10 (permalink)  
Antiguo 26/02/2010, 18:29
 
Fecha de Ingreso: febrero-2010
Mensajes: 39
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: un struct imprime mas de lo permitido

olvida lo que dije ¬¬, tengo la misma duda, a ver si alguien nos responde
  #11 (permalink)  
Antiguo 26/02/2010, 19:19
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: un struct imprime mas de lo permitido

Buenas,

Veamos, yo he ejecutado esto y no me ha dado ningún problema. En cualquier caso, voy a lanzar una hipótesis a ver si acierto:

Para almacenar el teléfono, usáis un string de 9 caracteres que, imagino, es la longitud del teléfono que queréis almacenar, por ejemplo, 623456789. Debéis tener en cuenta que un string necesita el carácter de finalización (\0) y, por tanto, para almacenar cualquier dato en formato string, necesitaréis X caracteres para el dato más 1 para el carácter de finalización. Para el teléfono, serían 10 caracteres.

Cuando a printf se le dice que imprima un string, inicia un bucle e imprime uno a uno todos los caracteres hasta que se encuentra el carácter de finalización. Si no lo habéis tenido en cuenta, pueden suceder 4 cosas:
1) Que vuestro programa esté bien echo y sólo haya almacenado 8 caracteres y, por tanto, se imprima bien
2) Que vuestro programa esté medianamente mal echo y haya almacenado 9 caracteres de modo que imprimirá caracteres hasta encontrar el de finalización (es decir, imprimirá, literalmente, lo que hay en RAM). En la RAM hay bastantes bytes a 0 y por eso imprime cosas raras sin saltar error.
3) Que vuestro programa esté mal echo y almacene tantos caracteres como le dais. Al suceder esto, se están (o pueden estar) machacando posiciones de RAM destinadas a código u otras variables. Estos son los casos que, más adelante en el mismo programa, originan el fallo de segmentación. La suerte en este caso, es que igualmente, el programa añade el carácter de final de string y el efecto visual es que imprime todo lo que le habéis dado por lo que parece que no respeta el límite de 9 pero, aparentemente, funciona bien.
4) Que vuestro programa esté mal echo, almacene tantos caracteres como le dais (por tanto, empiece a comer memoria RAM asignada a otras variables/códigos), no añada el carácter de final de string y, tengáis la mala suerte de no encontrar un carácter de final de string en la zona reservada a vuestro programa. Esto provoca que se empiece a imprimir la RAM en pantalla hasta que intenta imprimir posiciones fuera del rango asignado (por el sistema operativo) al programa y, por tanto, os salte un fallo de segmentación. El efecto visual sería el del punto 2 añadiendo el fallo de segmentación al final.

Por lo que he visto o me parece, si mi hipótesis es correcta, estáis en el punto 3. Para comprobarlo, os invito a que, si os aburrís le introduzcáis un string MUUUUUUUUUUUUUUUUUUUUY largo y lo más probable es que al dar a intro, os salte un fallo de segmentación por intentar escribir fuera de rango. También podéis probar de leer un string de este tipo al inicio de un programa que haga muchas más cosas y, probablemente, o tendréis resultados inesperados (cálculos aparentemente mal echos (es cuando el ordenador dice que 2 + 3 = -786342 y tu te quedas mirando la pantalla diciendo "pos vale, apaga y vámonos") o tendréis un fallo de segmentación en cualquier otro punto del programa.

En fin, esto es sólo una hipótesis.

P.D.: Para leer string, os recomiendo la función 'gets'. Y, sino, probad de, como lo hacéis ahora, almacenar en un mismo string, el nombre y apellido de una persona separado por un espacio.

Un saludo
__________________
Carlos

Recoger datos es solo el primer paso hacia la sabiduría. Pero compartir información es el primer paso hacia la comunidad. - IBM
  #12 (permalink)  
Antiguo 27/02/2010, 03:41
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 2
Respuesta: un struct imprime mas de lo permitido



no se si sera suficientemente largo. probare lo de gets, ya os contare
  #13 (permalink)  
Antiguo 27/02/2010, 03:50
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: un struct imprime mas de lo permitido

Bueno, teniendo en cuenta que un sistema operativo asigna del orden de kilobytes a un proceso pequeño y que tu proceso es muy pequeño, pues no, no es suficientemente largo por no decir que es ridículamente corto informáticamente hablando. 1 KB = 1024 B = 1024 caracteres

Saludos. Suerte con gets.
__________________
Carlos

Recoger datos es solo el primer paso hacia la sabiduría. Pero compartir información es el primer paso hacia la comunidad. - IBM
  #14 (permalink)  
Antiguo 27/02/2010, 09:06
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 2
Respuesta: un struct imprime mas de lo permitido

pues sigue sin haber suerte con gets...
  #15 (permalink)  
Antiguo 27/02/2010, 18:51
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: un struct imprime mas de lo permitido

Veamos,

'gets' no es la solución a tu problema, sólo es una función para coger correctamente los datos ya que 'scanf( "%s" )' no funciona para todos los casos.

Para solucionar este problema, tienes que usar las llamadas funciones seguras. Me parece que habían varias funciones para recoger según que datos de forma segura, pero, en cualquier caso, el 'scanf' también se puede hacer seguro.
En vez de:
Código C:
Ver original
  1. char telf[ 10 ]; //Recuerda a añadir el carácter de finalización!
  2. scanf( "%s", telf );

Haz esto:
Código C:
Ver original
  1. char telf[ 10 ]; //Recuerda a añadir el carácter de finalización!
  2. scanf( "%9s", telf );

Añadiendo ese 9, le estas diciendo a 'scanf', que quieres ingresar un string de, como mucho, 9 caracteres (luego, 'scanf', añadirá en la siguiente posición el carácter de finalización para completar los 10 chars que has reservado.

Saludos
__________________
Carlos

Recoger datos es solo el primer paso hacia la sabiduría. Pero compartir información es el primer paso hacia la comunidad. - IBM
  #16 (permalink)  
Antiguo 28/02/2010, 06:12
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 2
Respuesta: un struct imprime mas de lo permitido

gracias, ya me va =)

Etiquetas: imprime, mas
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 16:57.