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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  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,640 veces)
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #10 en: 20 Enero 2014, 15:16 pm »

No es eso, sino que se salta un caso. Y si le pongo aún más se salta más casos.

Es lo que te comenté. Al poner MAX=10 al noveno caracter se queda "fuera" de la cadena, es decir en el buffer. No he entendido lo de que se salta un caso. :rolleyes:

Una forma simple de evitarlo es la ya indicada de sobredimensionar MAX a 100, por poner un número. Se supone que si al usuario se le piden cuatro caracteres tampoco va a ser tan bruto de ingresar tropecientos.

Claro que como siempre hay brutitos dispuestos a reventar un código a la fuerza, otra opción es comprobar si la cadena es mayor o menor de cuatro dígitos y si no pedir nueva introducción de datos, siem`re que no se "pase" de 100 y si no más tamaño a Cadena. :rolleyes: :rolleyes: :rolleyes:

Lo cierto es que ahora funciona y sólo admite cuatro dígitos, ni más ni menos. Ya me comentarán que tal.

Y una muestra:


Citar

Introduce un numero de 4 digitos:
123

Introduce un numero de 4 digitos:
3215
Numero=3215     Cadena=3215
Introduce un numero de 4 digitos:
123456789456321

Introduce un numero de 4 digitos:
6541
Numero=6541     Cadena=6541
Introduce un numero de 4 digitos:
123

Introduce un numero de 4 digitos:
12

Introduce un numero de 4 digitos:
2589
Numero=2589     Cadena=2589
Introduce un numero de 4 digitos:
321654987654321654987

Introduce un numero de 4 digitos:
2561
Numero=2561     Cadena=2561

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

Por otro lado una pequeña observación:

.....................................................

int main()
{
    char Cadena[MAX+1]= {""};
    int i,Numero;
    char ch;

    while (1)
    {
        printf("\nIntroduce un numero de 4 digitos: \n");

        i = 0;

        //ch = getchar();

        while ((ch = getchar()) != '\n')

......................................................

la función getchar es de tipo int y por ello ch ha de ser int, no char. ;) ;) ;)

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



P.D: Se me olvidaba, el código como lo tienes, además de admitir menos de cuatro caracteres, admite hasta cinco.

Creo que es aquí donde está el error:


 while (1)
    {
        printf("\nIntroduce un numero de 4 digitos: \n");

        i = 0;

        //ch = getchar();

        while ((ch = getchar()) != '\n')
        {
            if (i < MAX) <== aquí va MAX-1
                Cadena[i++] = ch;
        }




« Última modificación: 20 Enero 2014, 15:27 pm por leosansan » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #11 en: 20 Enero 2014, 15:40 pm »

Tomo nota del getchar(), no sé porqué siempre pienso que devuelve un char (ese nombre puñetero  :¬¬).

Lo del MAX está perfecto, fijate que:
Código
  1. char Cadena[MAX+1]= {""};

La razón de ese cambio es que me parece más intuitivo y menos propenso a errores usar como unidad de longitud MAX que MAX - 1.


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 #12 en: 20 Enero 2014, 16:51 pm »

Tal como tienes en el post esta es la salida:

Citar

Introduce un numero de 4 digitos:
12345
Cadena = 12345   Numero = 12345<==AQUI admite 5 caracteres

Introduce un numero de 4 digitos:
1234
Cadena = 1234    Numero = 1234



Con la corrección que te indico del -1 esta es la salida:

Citar

Introduce un numero de 4 digitos:
12345
Cadena = 1234    Numero = 1234<==AQUI está O.K

Introduce un numero de 4 digitos:
1234
Cadena = 1234    Numero = 1234

Introduce un numero de 4 digitos:
123
Cadena = 123     Numero = 123


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



P.D: Pero conste que la gracia era solucionar lo del fgets, nada de scanf ni getchar.
« Última modificación: 20 Enero 2014, 16:53 pm por leosansan » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



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

Ah leñe, lo que tengo que hacer ahí es cambiar este printf:
Código
  1. printf("\nIntroduce un numero de 4 digitos: \n");

Por este más genérico:
Código
  1. printf("\nIntroduce un numero de %d digitos: \n",MAX);

Ala, problema resuelto ;D
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 #14 en: 20 Enero 2014, 20:24 pm »

Ah leñe, lo que tengo que hacer ahí es cambiar este printf:
Código
  1. printf("\nIntroduce un numero de 4 digitos: \n");

Por este más genérico:
Código
  1. printf("\nIntroduce un numero de %d digitos: \n",MAX);

Ala, problema resuelto ;D

¿Queeeeeeeeeeeeeeeeeeé?. ¿Qué es eso de problema resuelto?. Se trata de ingresar cuatro dígitos, no cinco pequeño saltamontes. :laugh:

Es coña, la hora será.

Eh aquí tu solución adaptada a cuatro dígitos y sólo cuatro:


Citar

Introduce un numero de 4 digitos:
123
Numero menor cifras.

Introduce un numero de 4 digitos:
3265
Cadena = 3265    Numero = 3265

Introduce un numero de 4 digitos:
12
Numero menor cifras.

Introduce un numero de 4 digitos:
123456
Numero mayor cifras.

Introduce un numero de 4 digitos:
2541
Cadena = 2541    Numero = 2541

Introduce un numero de 4 digitos:
1
Numero menor cifras.
[/size]

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.    int ch;
  10.    while (1){
  11.        printf("\nIntroduce un numero de 4 digitos: \n");
  12.        i = 0;
  13.        while ((ch = getchar()) != '\n') {
  14.            if (i<=MAX-1)
  15.            Cadena[i++] = ch;
  16.        }
  17.        if (i==MAX-1){
  18.            Cadena[i] = 0;
  19.            printf("Cadena = %s \t Numero = ",Cadena);
  20.          // Ahora convertimos la cadena a numerico
  21.          for(i=0; Cadena[i]; i++) {
  22.            Numero = Cadena[i] - TONUM;
  23.            printf("%d", Numero);
  24.        }
  25.        printf("\n");
  26.      }
  27.      else if (i>MAX-1)
  28.        puts ("Numero mayor cifras. ");
  29.      else
  30.        puts ("Numero menor cifras. ");
  31.    }
  32.    return 0;
  33. }
  34.  

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



REEDITADO Y MEJORADO.
« Última modificación: 20 Enero 2014, 23:22 pm por leosansan » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



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

Yo lo he interpetrado como n caraceteres  :-X

Por cierto:
Código
  1. while ((ch = getchar()) != '\n') {
  2.    Cadena[i++] = ch;
  3.           //printf("\ni=%d\n",i);
  4. }

¡Peligro de desbordamiento! Si le meto más caracteres de la cuenta (5) estaré desbordando el array.
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 #16 en: 20 Enero 2014, 23:23 pm »

Yo lo he interpetrado como n caraceteres  :-X

Por cierto:
Código
  1. while ((ch = getchar()) != '\n') {
  2.    Cadena[i++] = ch;
  3.           //printf("\ni=%d\n",i);
  4. }

¡Peligro de desbordamiento! Si le meto más caracteres de la cuenta (5) estaré desbordando el array.

Se me paso un if en el código anterior que ya he arreglado:

Código
  1. .............................
  2. while ((ch = getchar()) != '\n') {
  3.            if (i<=MAX-1)
  4.            Cadena[i++] = ch;
  5. .....................................
  6.  

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



P.D: Sigo pensando que esto se aparta del objetivo del fgets, que me ratifico en lo que propuse, salvo nueva aportación, cosa que espero.


« Última modificación: 20 Enero 2014, 23:26 pm por leosansan » En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #17 en: 21 Enero 2014, 00:15 am »

Hola, bueno no me leí todo el hilo pero diría que se trata de problemas con el salto de línea y fgets(). Dejo aquí mi pequeño granito de arena:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 5
  4.  
  5. int main()
  6. {
  7.    char buffer[MAX]={'\0'};
  8.    int ch;
  9.    char *p=NULL;
  10.  
  11.    fgets(buffer, MAX, stdin);
  12.    if (p=strchr(buffer, '\n')) // si se encuentra el '\n' se cambia por null
  13.        *p='\0';
  14.    else                        // si no se encuentra es que hay que vaciar el buffer de entrada
  15. while ((ch=getchar())!='\n' && ch!=EOF);
  16.  
  17.    printf("Introdujiste: %s\n", buffer);
  18.  
  19.    return 0;
  20. }

Si no tiene nada que ver con el hilo pido disculpas, pero es que con tanto post la verdad que da un poco de pereza encontrar el problema.

Saludos.
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [?] Error fgets (Solucionado)
« Respuesta #18 en: 21 Enero 2014, 02:53 am »

Hola, bueno no me leí todo el hilo pero diría que se trata de problemas con el salto de línea y fgets(). Dejo aquí mi pequeño granito de arena:
........................................
Si no tiene nada que ver con el hilo pido disculpas, pero es que con tanto post la verdad que da un poco de pereza encontrar el problema.

Buena aportación xiruko, da una nueva perspectiva.

Ahora sólo falta que diga que se rechaza por menor o mayor número de cifras. ;)


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


En línea

xiruko


Desconectado Desconectado

Mensajes: 438


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

Ahora sólo falta que diga que se rechaza por menor o mayor número de cifras. ;)

Aquí lo dejo ;D

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 5
  4.  
  5. int main()
  6. {
  7.    char buffer[MAX]={'\0'};
  8.    int ch;
  9.    char *p=NULL;
  10.    int basura=0;
  11.  
  12.    printf("Introduce %d caracteres: ", MAX-1);
  13.    fgets(buffer, MAX, stdin);
  14.  
  15.    if (p=strchr(buffer, '\n'))
  16. printf("ERROR: Faltan %ld caracteres.\n", MAX-1-(p-buffer));
  17.    else
  18.    {
  19. basura=1;
  20. while ((ch=getchar())!='\n' && ch!=EOF) basura++;
  21. if (basura > 1)
  22.    printf("ERROR: Sobran %d caracteres.\n", basura-1);
  23. else
  24.    printf("BIEN! Introdujiste solo %d caracteres.\n", MAX-1);
  25.    }
  26.  
  27.    return 0;
  28. }

Saludos.
En línea

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,191 Último mensaje 9 Marzo 2011, 03:54 am
por chipironn
Problema con fgets [Solucionado]
Programación C/C++
Søra 0 1,893 Ú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,870 Último mensaje 22 Mayo 2010, 12:42 pm
por Søra
El dichoso error de fgets.
Programación C/C++
samur88 6 6,512 Último mensaje 18 Mayo 2011, 20:51 pm
por samur88
Ayuda con fprintf y fgets [Solucionado]
Programación C/C++
Luchoz95 5 4,253 Último mensaje 21 Abril 2013, 17:31 pm
por dato000
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines