elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  scanf y gets
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: scanf y gets  (Leído 8,390 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
scanf y gets
« en: 17 Julio 2013, 02:37 am »

saludos

si tengo que ingresar en un vector 10 datos, por ejemplo: nombres, estos nombres tienen diferente longitud entonces tendria que poner char *nombre[10] pero a la hora de querer ingresar los datos con gets me aparecen warnings

Código
  1. for(i=0;i < 10;i++)
  2.    {
  3.        printf("Dame el nombre numero %d: ",i+1);
  4.        gets(nombre+i);
  5.        system("cls");
  6.    }


pero si cambio el gets por scanf de esta manera ya no me aparece y no entiendo porque

Código
  1. for(i=0;i < 10;i++)
  2.    {
  3.        printf("Dame el nombre numero %d: ",i+1);
  4.        scanf("%s",nombre+i);
  5.        system("cls");
  6.    }

si alguien fuera tan amable de explicarme esto se lo agradeceria mucho


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: scanf y gets
« Respuesta #1 en: 17 Julio 2013, 02:43 am »

Pues sin saber el tipo de variable y sin ver el warning no te podemos ayudar mucho.

Eso sí, gets está anticuada y no está recomendada su uso. En su lugar es preferible usar fgets:
http://www.cplusplus.com/reference/cstdio/fgets/

Que vendría a ser:
Código
  1. fgets(nombre,10,stdin); // Leer del teclado 10 caracteres y meterlos en nombre


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: scanf y gets
« Respuesta #2 en: 17 Julio 2013, 03:11 am »

saludos amchacon el tipo de dato es char *arreglo[10] y el warning dice:

passing argument 1 of gets from incompatible pointer type

esto en la linea
Código
  1. gets(nombre+i);

y tambien sale una nota que dice expected char* but argument is of type char**

gracias
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: scanf y gets
« Respuesta #3 en: 17 Julio 2013, 10:59 am »

*arreglo[10] es un vector de punteros... equivalente ( que no igual ) a **arreglo, es decir, "char**"

si tu en una instrucción pones "nombre + i"... el tipo resultante sigue siendo char**, que es incompatible con el que espera gets ( char* )

Para resolver eso tienes que quitar un nivel de indirección en el puntero, es decir, pasar de un puntero doble a un puntero simple.

¿De qué manera has definido la variable "arreglo"?

Sin más información es complicado darte una explicación más acertada.
En línea

aguml


Desconectado Desconectado

Mensajes: 378



Ver Perfil
Re: scanf y gets
« Respuesta #4 en: 17 Julio 2013, 11:19 am »

gets(*nombre[i*10]);

Aunque es solo una suposicion porque sin ver la declaracion...
En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: scanf y gets
« Respuesta #5 en: 17 Julio 2013, 21:25 pm »

eferion como es eso de que *arreglo[10] es equivalente a **arreglo???
En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: scanf y gets
« Respuesta #6 en: 17 Julio 2013, 21:32 pm »

y otra duda tambien de un vector de punteros

por ejemplo si tengo

Código
  1. char *meses[3] ={"Enero","Febrero","Marzo"};
  2. for(i=0;i < 3;i++)
  3.    printf("%s",*meses+i);


aqui me imprime Enero Nero Ero

pero si a la linea del printf le agrego unos parentesis
Código
  1. printf("%s",*(meses+i));

me imprime correctamente Enero Febrero Marzo

no entiendo por que
     
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: scanf y gets
« Respuesta #7 en: 17 Julio 2013, 23:53 pm »

y otra duda tambien de un vector de punteros

por ejemplo si tengo

Código
  1. char *meses[3] ={"Enero","Febrero","Marzo"};
  2. for(i=0;i < 3;i++)
  3.    printf("%s",*meses+i);


aqui me imprime Enero Nero Ero

pero si a la linea del printf le agrego unos parentesis
Código
  1. printf("%s",*(meses+i));

me imprime correctamente Enero Febrero Marzo

no entiendo por que
     

Si tu dibujas el mapa de memoria tendrás que lo que el vector se encuentra estructurado así ( cada letra una posición de memoria ):

'E' 'n' 'e' 'r' 'o' '\0' 'F' 'e' 'b' 'r' 'e' 'r' 'o' '\0' 'M' 'a' 'r' 'z' 'o' '\0'

y dado que "meses" es una matriz de cadena de caracteres, se cumple que:

*meses es igual a *meses + 0 y apunta al primer carácter ( 'E' ).
*meses + 1 es un desplazamiento de una posición respecto a *meses, es decir,  apunta al segundo carácter ( 'n' )
*meses + 2 es un desplazamiento de dos posiciones respecto a *meses, es decir,  apunta al tercer carácter ( 'e' )
...

Es decir, primero resuelves el puntero *meses y luego incrementas la posición apuntada.

Con esto, si intentas imprimir las cadenas resultantes te sale:

Enero, nero, ero, ro, o, (nada), Febrero, ebrero, ...

Sin embargo, *( meses + i ) es equivalente a moverte primero una fila y apuntar al caracter que esté en esa posición, de tal forma que:

*(meses + 0) o *meses apunta a 'E'
*(meses + 1) apunta a 'F'
*(meses + 2) apunta a 'M'

Al final el cambio viene promovido porque los paréntesis cambian el orden en el que se ejecutan las operaciones... no es lo mismo resolver un puntero doble y luego incrementar su posición que incrementar un puntero doble y resolver su posición.
En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: scanf y gets
« Respuesta #8 en: 18 Julio 2013, 20:23 pm »

Muchas gracias eferion por tus respuestas ahora ya me quedo claro, solo es cuestion de repasar las prioridades de los operadores (),[],*,+, etc...


Una ultima pregunta cuando yo declaro un arreglo de punteros char *a[5]; para despues con un for ingresarle cada uno de los elementos (a+1),(a+2),etc..., primero tengo que asignarle memoria dinamica con malloc, calloc ???
En línea

Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: scanf y gets
« Respuesta #9 en: 18 Julio 2013, 23:25 pm »

Una ultima pregunta cuando yo declaro un arreglo de punteros char *a[5]; para despues con un for ingresarle cada uno de los elementos (a+1),(a+2),etc..., primero tengo que asignarle memoria dinamica con malloc, calloc ???

Si, esto seria asi:

Código
  1. a[i] = (char *) malloc(n * sizeof(char));

Y para ingresar cada elemento con un bucle for:

Código
  1. int i;
  2. for (i=0; i<5; i++)
  3.    {
  4.        scanf("%s", a[i]);
  5.    }
« Última modificación: 18 Julio 2013, 23:38 pm por Caster » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] Comparación entre el gets y el scanf « 1 2 »
Programación C/C++
niñoAtómico 12 6,366 Último mensaje 12 Octubre 2013, 23:24 pm
por vangodp
sustituir scanf « 1 2 »
Programación C/C++
m@o_614 11 7,118 Último mensaje 17 Octubre 2013, 17:59 pm
por Eternal Idol
problema scanf
Programación C/C++
pMV2ere 4 3,232 Último mensaje 1 Noviembre 2013, 08:44 am
por vangodp
Ayuda con el scanf n el for
Programación C/C++
Jorge LuissxX 2 1,666 Último mensaje 18 Mayo 2019, 02:07 am
por K-YreX
scanf C - borland
Programación C/C++
Carlosj1 2 2,060 Último mensaje 24 Julio 2019, 20:26 pm
por Carlosj1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines