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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [?] Error fgets (Solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [?] Error fgets (Solucionado)  (Leído 9,556 veces)
MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
[?] Error fgets (Solucionado)
« en: 19 Enero 2014, 14:56 pm »

Hola, tengo un problema con fgets, estoy intentando separar un numero de 4 digitos, e introducir cada uno de ellos en una posicion del array  :silbar:

Para eso lo guardo en un array de caracteres y asi ya me guarda en cada posicion un numero, pero tal y como esta el codigo ahora solo guarda tres (lo he mirado con el debugger), cuando en teoria deberia guardar 4 (MAX)

Debería hacer esto:

Numero: 4578

Pos_1      Pos_2      Pos_3      Pos_4
  4             5             7            8

Pero hace esto:

Numero: 4578

Pos_1      Pos_2      Pos_3      Pos_4
   4             5             7            -48

Es decir, la ultima posicion del array la toma como 0, y al restar 48 (es lo mismo usar la funcion atoi), se queda en -48  :o

Código
  1. #include <stdio.h>
  2.  
  3. #define MAX 4
  4. #define TONUM 48
  5.  
  6. int main()
  7. {
  8. char Cadena[MAX];
  9. int Numero[MAX];
  10.  
  11.        printf("Introduce un numero de 4 digitos: ");
  12.        fgets(Cadena, MAX, stdin);
  13.        getchar();
  14.  
  15.        // Ahora convertimos la cadena a numerico
  16.  
  17.        for(int i=0;i<MAX;i++)
  18.        {
  19.            Numero[i] = Cadena[i] - TONUM;
  20.            printf("%d", Numero[i]);
  21.        }
  22.  
  23.        return 0;
  24. }

No se donde puedes estar el error, porque seguro que es muy tonto  :rolleyes:  :rolleyes:

Saludos

(El código es un recorte del grande, pero esa es la parte que falla, asi que quizas no va bien porque me he dejado algo  ;D )


« Última modificación: 19 Enero 2014, 15:42 pm por MeCraniDOS » En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: [?] Error fgets
« Respuesta #1 en: 19 Enero 2014, 15:30 pm »

Hola MeCraniDOS mira esto:
Citar
Código
  1. char * fgets ( char * str, int num, FILE * stream );

Get string from stream
Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or the end-of-file is reached, whichever happens first.
Fuente http://www.cplusplus.com/reference/cstdio/fgets/
Es decir que fgets por definición lee carácteres del stream y los almacena en str hasta un número de (num-1) carácteres, así que para arreglar tu codigo, o igualas MAX a 5 o pones MAX+1 en fgets como te he puesto en tu código:
Código
  1.    #include <stdio.h>
  2.  
  3.    #define MAX 4
  4.    #define TONUM 48
  5.  
  6.    int main()
  7.    {
  8.    char Cadena[MAX];
  9.    int Numero[MAX];
  10.  
  11.           printf("Introduce un numero de 4 digitos: ");
  12.           fgets(Cadena, MAX+1, stdin);
  13.           getchar();
  14.  
  15.           // Ahora convertimos la cadena a numerico
  16.  
  17.           for(int i=0;i<MAX;i++)
  18.           {
  19.               Numero[i] = Cadena[i] - TONUM;
  20.               printf("%d", Numero[i]);
  21.           }
  22.  
  23.           return 0;
  24.    }
¡Un saludo!


« Última modificación: 19 Enero 2014, 15:37 pm por avesudra » En línea

Regístrate en
MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [?] Error fgets
« Respuesta #2 en: 19 Enero 2014, 15:41 pm »

Hola MeCraniDOS mira esto:Es decir que fgets por definición lee carácteres del stream y los almacena en str hasta un número de (num-1) carácteres

Eso es lo que habia hecho, poner (MAX + 1), pero no sabia el porque con 5 cogia 4, con 4 cogia 3, etc

Vale, pues muchas gracias ;-)

Saludos
En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #3 en: 19 Enero 2014, 15:52 pm »

Eso es lo que habia hecho, poner (MAX + 1), pero no sabia el porque con 5 cogia 4, con 4 cogia 3, etc
Pues esa no era la solución xD.

El código original funciona perfectamente, lo que pasa esque el último elemento es el caracter nulo. Por eso te sale -48.

Si pones en el fgets un (MAX+1), lo que pasará esque pondrá el caracter nulo FUERA de la cadena, modificar memoria que no te toca no es nada bueno nunca. Te funciona porque la cadena es la última variable que habías reservado de modo que solo estás modificando espacio vacio, si no fuera así estarías modificando el contenido de otra variable xD. Y si haces eso con memoria dinámica tu progama directamente abortará.

La solución es poner MAX = 5, también cambiara el for por:
Código
  1. for(int i=0;Cadena[i] != '\0';i++)
  2. {
  3.    Numero[i] = Cadena[i] - TONUM;
  4.    printf("%d", Numero[i]);
  5. }

De esa forma leerá hasta que encuentre el caracter nulo, lo que te permitirá meter cadenas de 1,2,3,4 caracteres. Tú código actual solo permite cadenas de 4 caracteres (si le metes 3, te saldrán un dato "extraño".
« Última modificación: 19 Enero 2014, 15:55 pm por amchacon » 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
MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #4 en: 19 Enero 2014, 16:53 pm »

Pues esa no era la solución xD.

El código original funciona perfectamente, lo que pasa esque el último elemento es el caracter nulo. Por eso te sale -48.

En un principio habia pensado lo del caracter nulo, pero al pasarlo por el debugger tampoco me ponia el '\0', asi que lo he descartado  :-[

De todas formas ya he modificado un par de cosas y funciona bien  :laugh:

Gracias  ;-)
En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #5 en: 19 Enero 2014, 17:01 pm »

En un principio habia pensado lo del caracter nulo, pero al pasarlo por el debugger tampoco me ponia el '\0', asi que lo he descartado
'\0' es solo un simbolo para ti, el compilador lo traduce como un 0:
Código
  1. for(int i=0;Cadena[i] != 0;i++)
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
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #6 en: 19 Enero 2014, 21:56 pm »


La solución es poner MAX = 5, también cambiara el for por:
Código
  1. for(int i=0;Cadena[i] != '\0';i++)
  2. {
  3.    Numero[i] = Cadena[i] - TONUM;
  4.    printf("%d", Numero[i]);
  5. }



De esa forma leerá hasta que encuentre el caracter nulo, lo que te permitirá meter cadenas de 1,2,3,4 caracteres. Tú código actual solo permite cadenas de 4 caracteres (si le metes 3, te saldrán un dato "extraño".


La solución que aporta amchacon tiene un "pero", el caracter de fin de línea que introduce fgets al final de la cadena que podría tener efectos indeseables en el resto del código.

He aquí una salida con "repetición" para ver el efecto indeseado de ese caracter:


Código
  1. #include <stdio.h>
  2. #define MAX 5
  3. #define TONUM 48
  4.  
  5. int main()
  6. {
  7. char Cadena[MAX]={""},come_buffer[100];
  8. int i,ch,Numero[MAX-1];
  9.  
  10.  while (1)
  11.  {
  12.    printf("\nIntroduce un numero de 4 digitos: \n");
  13.    fgets(Cadena, MAX, stdin);
  14.    // Ahora convertimos la cadena a numerico
  15.  
  16.    for(i=0;Cadena[i];i++)
  17.    {
  18.        Numero[i] = Cadena[i] - TONUM;
  19.        printf("%d", Numero[i]);
  20.    }//while((ch = getchar()) != '\n');
  21.  }
  22.  return 0;
  23. }
  24.  

Citar

Introduce un numero de 4 digitos:
1234
1234
Introduce un numero de 4 digitos:<==de forma automática "salta" la introducción a mano
-38
Introduce un numero de 4 digitos:
12345
1234
Introduce un numero de 4 digitos:<==de forma automática "salta" la introducción a mano y devuelve lo que quedaba en el buffer, el 5, acompañado además
5-38
Introduce un numero de 4 digitos:<==si es menor que 4 devuelve el número "acompañado"
12
12-38
Introduce un numero de 4 digitos:
5432
5432
Introduce un numero de 4 digitos:<==de forma automática "salta" la introducción a mano
-38
Introduce un numero de 4 digitos:<==si es menor que 4 devuelve el número "acompañado"
321
321-38
Introduce un numero de 4 digitos:
123456
1234
Introduce un numero de 4 digitos:<==salto automático y
56-38<==lo que queda en el buffer "acompañado"

Una forma de evitar ambas cosas, el caracter extraño y tener que limpiar el buffer, es sobredimensionar de entrada el array Cadena y ya luego nos ocupamos de darle el tamaño que queramos, 5 en este caso.

Con esta idea, ésta es la salida:


Citar

Introduce un numero de 4 digitos:
123
Numero=123      Cadena=123
Introduce un numero de 4 digitos:
1234567
Numero=1234     Cadena=1234
Introduce un numero de 4 digitos:
32
Numero=32       Cadena=32
Introduce un numero de 4 digitos:
32564
Numero=3256     Cadena=3256
Introduce un numero de 4 digitos:
3214
Numero=3214     Cadena=3214
Introduce un numero de 4 digitos:
1
Numero=1        Cadena=1

Código
  1. #include <stdio.h>
  2. #define MAX 10
  3. #define N 5
  4. #define TONUM 48
  5.  
  6. int main()
  7. {
  8. char Cadena[MAX]={""},come_buffer[100];
  9. int i,ch,Numero[N];
  10.  
  11.  while (1)
  12.  {
  13.    printf("\nIntroduce un numero de 4 digitos: \n");
  14.    fgets(Cadena, MAX, stdin);
  15.    if (strlen(Cadena)<MAX)
  16.      Cadena[strlen(Cadena)-1] = '\0';
  17.    Cadena[N-1] = '\0';
  18.      // Ahora convertimos la cadena a numerico
  19.    printf("Numero=");
  20.    fflush(stdout);
  21.    for(i=0;Cadena[i];i++)
  22.    {
  23.        Numero[i] = Cadena[i] - TONUM;
  24.        printf("%d", Numero[i]);
  25.    }
  26.    printf("\tCadena=%s", Cadena);
  27.  }
  28.  return 0;
  29. }
  30.  

Es sólo una idea, ¡¡¡Ehhhh!!!. Admito con gusto otras sugerencias más cualificadas que la mía. ;) ;) ;)

¡¡¡¡ Saluditos! ..... !!!!


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #7 en: 19 Enero 2014, 23:15 pm »

Vaya pues no había caído en eso :-X. Muy buen ojo Leo.

Tú solución no funciona adecuadamente si le metes 9 caracteres o más. El buffer de escritura es una fulana de cuidado.

La solución que se me ocurre es leerlo caracter a caracter:
Código
  1. #include <stdio.h>
  2. #define MAX 5
  3. #define TONUM 48
  4.  
  5. int main()
  6. {
  7.    char Cadena[MAX+1]= {""};
  8.    int i,Numero;
  9.    char ch;
  10.  
  11.    while (1)
  12.    {
  13.        printf("\nIntroduce un numero de 4 digitos: \n");
  14.  
  15.        i = 0;
  16.  
  17.        //ch = getchar();
  18.  
  19.        while ((ch = getchar()) != '\n')
  20.        {
  21.            if (i < MAX)
  22.                Cadena[i++] = ch;
  23.        }
  24.  
  25.        Cadena[i] = 0;
  26.  
  27.        printf("Cadena = %s \t Numero = ",Cadena);
  28.  
  29.        // Ahora convertimos la cadena a numerico
  30.  
  31.        for(i=0; Cadena[i]; i++)
  32.        {
  33.            Numero = Cadena[i] - TONUM;
  34.            printf("%d", Numero);
  35.        }
  36.  
  37.        printf("\n");
  38.    }
  39.    return 0;
  40. }
« Última modificación: 19 Enero 2014, 23:18 pm por amchacon » 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
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #8 en: 20 Enero 2014, 11:17 am »

Vaya pues no había caído en eso :-X. Muy buen ojo Leo.

Tú solución no funciona adecuadamente si le metes 9 caracteres o más. El buffer de escritura es una fulana de cuidado.

La solución que se me ocurre es leerlo caracter a caracter:


Excelente opción. ;-) ;-) ;-

Y lo de los nueve caracteres es por el tamaño que le dí a MAX, Si lo pongo mayor más "traga". Pero no es plan, claro.

¡¡¡¡ Saluditos! ..... !!!!



En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #9 en: 20 Enero 2014, 11:44 am »

Y lo de los nueve caracteres es por el tamaño que le dí a MAX, Si lo pongo mayor más "traga". Pero no es plan, claro.
No es eso, sino que se salta un caso. Y si le pongo aún más se salta más casos.
« Última modificación: 20 Enero 2014, 11:51 am por amchacon » 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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
(Solucionado)Error, messenger no conecta, error puertos clave, 80072efd « 1 2 »
Mensajería
leogtz 14 36,058 Último mensaje 9 Marzo 2011, 03:54 am
por chipironn
Problema con fgets [Solucionado]
Programación C/C++
Søra 0 1,868 Último mensaje 22 Mayo 2010, 12:15 pm
por Søra
Dudas con estructura While y con fgets [Solucionado]
Programación C/C++
Søra 0 1,848 Último mensaje 22 Mayo 2010, 12:42 pm
por Søra
El dichoso error de fgets.
Programación C/C++
samur88 6 6,477 Último mensaje 18 Mayo 2011, 20:51 pm
por samur88
Ayuda con fprintf y fgets [Solucionado]
Programación C/C++
Luchoz95 5 4,217 Último mensaje 21 Abril 2013, 17:31 pm
por dato000
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines