Autor
|
Tema: [?] Error fgets (Solucionado) (Leído 10,287 veces)
|
leosansan
Desconectado
Mensajes: 1.314
|
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.
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.
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: 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
#include <stdio.h> #include <string.h> #define TONUM 48 #define MAX 100 #define N 5 int main() { char Cadena[MAX]={""}; int i,ch,Numero[N]; while (1) { do{ printf("\nIntroduce un numero de 4 digitos: \n"); fgets(Cadena, MAX, stdin); }while (strlen(Cadena)!=N); Cadena[N-1] = '\0'; // Ahora convertimos la cadena a numerico printf("Numero="); fflush(stdout); for(i=0;Cadena[i];i++) { Numero[i] = Cadena[i] - TONUM; printf("%d", Numero[i]); } printf("\tCadena=%s", Cadena); } return 0; }
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
Mensajes: 1.211
|
Tomo nota del getchar(), no sé porqué siempre pienso que devuelve un char (ese nombre puñetero ). Lo del MAX está perfecto, fijate que: 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
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Tal como tienes en el post esta es la salida: 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: 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
Mensajes: 1.211
|
Ah leñe, lo que tengo que hacer ahí es cambiar este printf: printf("\nIntroduce un numero de 4 digitos: \n");
Por este más genérico: printf("\nIntroduce un numero de %d digitos: \n",MAX);
Ala, problema resuelto
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Ah leñe, lo que tengo que hacer ahí es cambiar este printf: printf("\nIntroduce un numero de 4 digitos: \n");
Por este más genérico: printf("\nIntroduce un numero de %d digitos: \n",MAX);
Ala, problema resuelto ¿Queeeeeeeeeeeeeeeeeeé?. ¿Qué es eso de problema resuelto?. Se trata de ingresar cuatro dígitos, no cinco pequeño saltamontes.
Es coña, la hora será.
Eh aquí tu solución adaptada a cuatro dígitos y sólo cuatro: 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]
#include <stdio.h> #define MAX 5 #define TONUM 48 int main() { char Cadena[MAX+1]= {""}; int i,Numero; int ch; while (1){ printf("\nIntroduce un numero de 4 digitos: \n"); i = 0; while ((ch = getchar()) != '\n') { if (i<=MAX-1) Cadena[i++] = ch; } if (i==MAX-1){ Cadena[i] = 0; printf("Cadena = %s \t Numero = ",Cadena); // Ahora convertimos la cadena a numerico for(i=0; Cadena[i]; i++) { Numero = Cadena[i] - TONUM; printf("%d", Numero); } printf("\n"); } else if (i>MAX-1) puts ("Numero mayor cifras. "); else puts ("Numero menor cifras. "); } return 0; }
¡¡¡¡ Saluditos! ..... !!!! REEDITADO Y MEJORADO.
|
|
« Última modificación: 20 Enero 2014, 23:22 pm por leosansan »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Yo lo he interpetrado como n caraceteres Por cierto: while ((ch = getchar()) != '\n') { Cadena[i++] = ch; //printf("\ni=%d\n",i); }
¡Peligro de desbordamiento! Si le meto más caracteres de la cuenta (5) estaré desbordando el array.
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Yo lo he interpetrado como n caraceteres Por cierto: while ((ch = getchar()) != '\n') { Cadena[i++] = ch; //printf("\ni=%d\n",i); }
¡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:............................. while ((ch = getchar()) != '\n') { if (i<=MAX-1) Cadena[i++] = ch; .....................................
¡¡¡¡ 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
Mensajes: 438
|
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: #include <stdio.h> #include <string.h> #define MAX 5 int main() { char buffer[MAX]={'\0'}; int ch; char *p=NULL; fgets(buffer , MAX , stdin ); if (p =strchr(buffer , '\n')) // si se encuentra el '\n' se cambia por null *p='\0'; else // si no se encuentra es que hay que vaciar el buffer de entrada while ((ch =getchar())!='\n' && ch !=EOF ); printf("Introdujiste: %s\n", buffer ); return 0; }
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
Mensajes: 1.314
|
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
Mensajes: 438
|
Ahora sólo falta que diga que se rechaza por menor o mayor número de cifras. Aquí lo dejo #include <stdio.h> #include <string.h> #define MAX 5 int main() { char buffer[MAX]={'\0'}; int ch; char *p=NULL; int basura=0; printf("Introduce %d caracteres: ", MAX -1); fgets(buffer , MAX , stdin ); printf("ERROR: Faltan %ld caracteres.\n", MAX -1-(p -buffer )); else { basura=1; while ((ch =getchar())!='\n' && ch !=EOF ) basura ++; if (basura > 1) printf("ERROR: Sobran %d caracteres.\n", basura -1); else printf("BIEN! Introdujiste solo %d caracteres.\n", MAX -1); } return 0; }
Saludos.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
(Solucionado)Error, messenger no conecta, error puertos clave, 80072efd
« 1 2 »
Mensajería
|
leogtz
|
14
|
37,110
|
9 Marzo 2011, 03:54 am
por chipironn
|
|
|
Problema con fgets [Solucionado]
Programación C/C++
|
Søra
|
0
|
2,053
|
22 Mayo 2010, 12:15 pm
por Søra
|
|
|
Dudas con estructura While y con fgets [Solucionado]
Programación C/C++
|
Søra
|
0
|
2,020
|
22 Mayo 2010, 12:42 pm
por Søra
|
|
|
El dichoso error de fgets.
Programación C/C++
|
samur88
|
6
|
6,762
|
18 Mayo 2011, 20:51 pm
por samur88
|
|
|
Ayuda con fprintf y fgets [Solucionado]
Programación C/C++
|
Luchoz95
|
5
|
4,492
|
21 Abril 2013, 17:31 pm
por dato000
|
|