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

No me hace un gets

Estas en el tema de No me hace un gets en el foro de C/C++ en Foros del Web. Hola, lo que pasa es que quiero almacenar un conjunto de cadenas en un array bidimensional, lo hago individualmente y me funciona perfecto, pero cuando ...
  #1 (permalink)  
Antiguo 08/03/2015, 11:12
 
Fecha de Ingreso: marzo-2015
Mensajes: 2
Antigüedad: 9 años, 8 meses
Puntos: 0
No me hace un gets

Hola, lo que pasa es que quiero almacenar un conjunto de cadenas en un array bidimensional, lo hago individualmente y me funciona perfecto, pero cuando le pongo la otra parte de la programación arriba no me lee el primer gets y se brinca hasta el segundo.


Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. main(){
  4.     char nombres[100][100];
  5.     int i;
  6.    
  7.     for(i=0;i<3;i++){
  8.     printf("Alumno numero %d: ",i+1);
  9.     gets(nombres[i]);
  10.     }
  11.     printf("\n");
  12.     for(i=0;i<3;i++){
  13.         printf("%s\n",nombres[i]);
  14.     }
  15. }

Cuando lo pongo así me lo ejecuta con normalidad, pero al ponerlo así:

Código C:
Ver original
  1. #include<stdio.h>
  2.  
  3. main(){
  4.     int n,i,k,notas[100];
  5.     char nombres[100][100];
  6.    
  7.     printf("Introduzca la cantidad de alumnos: ");
  8.     scanf("%d",&k);
  9.     printf("Introduzca la cantidad de notas por alumno: ");
  10.     scanf("%d",&n);
  11.    
  12.    
  13.     for(i=0;i<k;i++){
  14.         printf("Alumno numero %d: ",i+1);
  15.         gets(nombres[i]);
  16.     }
  17.            
  18.    
  19.     for(i=0;i<k;i++){
  20.         printf("%s\n",nombres[i]);
  21.     }
  22. }

Si pongo que son 3 alumnos, por decir, me imprime consecutivo:

Alumno 1: Alumno 2:

y no me deja almacenar nada en el primero, qué puedo hacer o cuál es la manera correcta de hacerlo? :(
Soy nuevo en esto, disculpen las molestias :c

Última edición por razpeitia; 08/03/2015 a las 17:12
  #2 (permalink)  
Antiguo 08/03/2015, 12:44
Avatar de anggiebs  
Fecha de Ingreso: julio-2014
Ubicación: Madrid
Mensajes: 35
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: No me hace un gets

Yo no sé de C pero en C++ ese problema me ha sucedido y era porque utilizaba un comando que no debía.
Por ejemplo :
Si quería leer un número tenía que usar un comando distinto a si quería leer una cadena de caracteres porque dependiendo del comando,este lee todo el carácter y se queda al final de este ,o bien,leía el carácter pero dejaba de lado el siguiente espacio en blanco.

Espero que me haya explicado algo :D ,en resumen,eso puede suceder porque cuando se introduce las notas del alumno,se lee la nota y se queda allí ,lo siguiente que leerá el Alumno 1 será el espacio en blanco.
  #3 (permalink)  
Antiguo 08/03/2015, 13:25
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: No me hace un gets

En ves de gets(nombres[i]); usa scanf ("%99[\n]%*c", nombres[i]); Y dime como te va.
Esa criatura de arriba lee 99 caracteres hasta encontrar el carácter \n y cuando eso pase lo ignora.

Si tienes una cadena de 100 solo puedes leer 99 ya que el ultimo es el carácter que marca el fin de la cadena.

El problema es la tecla enter que permanece en el buffer y es la causante de tu problema, debes limpiar el buffer o ignorar esa tecla. En el caso que te pase con el scanf la estamos ignorando.
  #4 (permalink)  
Antiguo 08/03/2015, 13:46
 
Fecha de Ingreso: marzo-2015
Mensajes: 2
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: No me hace un gets(casi)

Ya me leyó el Alumno 1, pero ahora se brinca el resto del programa.
  #5 (permalink)  
Antiguo 08/03/2015, 14:07
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: No me hace un gets

Código C:
Ver original
  1. #include<stdio.h>
  2.  
  3. main() {
  4.     int n, i, k, notas[100];
  5.     char nombres[100][100];
  6.     printf ( "Introduzca la cantidad de alumnos: " );
  7.     scanf ( "%d%*c", &k );
  8.     printf ( "Introduzca la cantidad de notas por alumno: " );
  9.     scanf ( "%d%*c", &n );
  10.    
  11.     for ( i = 0; i < k; i++ ) {
  12.         printf ( "Alumno numero %d: ", i + 1 );
  13.         scanf ( "%99[^\n]%*c", nombres[i]);
  14.     }
  15.    
  16.     for ( i = 0; i < k; i++ ) {
  17.         printf ( "%s\n", nombres[i] );
  18.     }
  19. }
Estaba editando el otro texto pero no me dio tiempo XD

a ver...

para leer un char o un int al que despues vas a leer mas chars ya sean solos o en cadena usas: scanf ( "%d%*c", &letra ); El %*c ignora el enter si lo quitas va dar problemas, puedes probar. XD

Para leer una cadena usa: scanf ( "%99[^\n]%*c", cadenaCaracteres); para leer 99 chars ignorar el enter y poner el \0 al final de la cadena(un chollo XD). Solo tiene un problema... Si introduces mas de 99 chars el restante te va quedar en el buffer y entrará en la siguiente variable, pero lo mismo le pasa con gets y otras funciones, si quieres estar segura aprende a limpiar el buffer que te va ser mejor.

Si declaras una cadena de 200 en el scanf pones %199 en vez de 99 capiche? Uno menos de lo que declaras siempre.

No se si hay nada mejor, apenas limpiando el buffer, que es algo mas complicado.
  #6 (permalink)  
Antiguo 08/03/2015, 14:44
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: No me hace un gets

para limpiar el buffer haces fflush(stdin); para leer la cadena de 99 bytes haces fgets(buffer, 100, stdin); para poner el ultimo byte a 0 buffer[strlen(buffer)]='\n'; luego haces fflush(stdin); para limpiar el buffer de entrada.
  #7 (permalink)  
Antiguo 08/03/2015, 14:50
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: No me hace un gets

nop... no debes hacer fflush(stdin);.
fflush es para trabajar con el buffer de salida, y además con cadenas de caracteres pueden producirse comportamientos indeterminados.

Si buscas por la red seguro encuentras más respuestas sobre el tema de por que no debes usar fflush NUNCA. XD
  #8 (permalink)  
Antiguo 08/03/2015, 15:11
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: No me hace un gets

Cita:
Iniciado por vangodp Ver Mensaje
nop... no debes hacer fflush(stdin);.
fflush es para trabajar con el buffer de salida, y además con cadenas de caracteres pueden producirse comportamientos indeterminados.
Exactamente. fflush(stdin); es de "comportamiento indefinido":
http://en.cppreference.com/w/cpp/io/c/fflush
Cita:
For output streams (and for update streams on which the last operation was output), writes any unwritten data from the stream's buffer to the associated output device.

For input streams (and for update streams on which the last operation was input), the behavior is undefined.
"Comportamiento indefinido" no necesariamente excluye la posibilidad de que algún compilador en particular quiera incluirla como una extensión, pero en todo caso habría que aclarar que esa línea sólo es válida para ese compilador (y olvidarse de la portabilidad).
  #9 (permalink)  
Antiguo 08/03/2015, 15:25
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: No me hace un gets

Es lo que pasa. Usas una vez, te va bien y ya creerás que te va ir bien toda la vida... Hasta que te deje de ir bien XDD

Al menos esta avisado lo que puede pasar.

"Puede" no quiere decir que 'vaya' a dar problemas, pero la portabilidad si que puede verse afectada y mucho.

Etiquetas: arreglos
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 13:53.