Autor
|
Tema: |Lo que no hay que hacer en C/C++. Nivel basico| (Leído 164,573 veces)
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Pero es lo que dije antes, fgets deja basura en el buffer si el usuario escribe un número de caracteres mayor que el del segundo parámetro. Le puedo poner 1000 en el segundo parámetro, pero si el usuario mete 1001 caracteres fgets deja 1 en el buffer . Saludos ¿Y para qué crees que es el sscanf()?
|
|
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
¿Y para qué crees que es el sscanf()?
sscanf opera sobre el buffer del primer parámetro de fgets, no limpia stdin, que es el problema . Saludos
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
#include <stdio.h> int main() { unsigned int n; char buffer[100]; do { fgets(buffer , 99, stdin ); } while(sscanf(buffer , "%u", &n ) != 1); return 0; }
|
|
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
#include <stdio.h> int main() { unsigned int n; char buffer[10]; do { } while(sscanf(buffer , "%u", &n ) != 1); return 0; }
Si meto un número de caracteres menor que el buffer, el getchar() funciona porque stdin está limpio, pero si meto 15 caracteres, getchar() obtiene lo que quedó en stdin sobrante y no hace lo que quería que hiciera. Saludos
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
¿Alguna razon para no usar un buffer de entrada de por ejemplo 120 caracteres? fgets no deja basura, a lo sumo no lee mas de lo permitido pero no es lo mismo.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
¿Alguna razon para no usar un buffer de entrada de por ejemplo 120 caracteres? fgets no deja basura, a lo sumo no lee mas de lo permitido pero no es lo mismo.
Bueno, pues preferiría evitar que haga eso. Si meto un buffer de 300 bytes pues al usuario no se le va a ocurrir introducir más, y si lo hace es normal que el programa no funcione correctamente, pero si se puede evitar mejor. Saludos
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
Mas allá de la seguridad de fgets, también es mas estable dado que su comportamiento es predecible. Para lograr lo mismo con scanf hay que jugar bastante con los parámetros, y a la larga queda poco agradable a la vista y un tanto confuso.
No hay nada en C para descartar caracteres (como si lo hay en C++) por lo que si se trata de mantener el estándar la mejor alternativa es hacer una función con el primer código que pusiste y llamarla cuando corresponda -pero cuidado, chequear \n pero también EOF-
Si realmente necesitas mas flexibilidad entonces no te queda alternativa mas que utilizar funciones especificas del sistema ya sea para limpiar el buffer o para modificar el modo de I/O.
Saludos!
|
|
|
En línea
|
An expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
Gracias, era lo que quería saber, ya no hay duda . Saludos
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
Maurice_Lupin
Desconectado
Mensajes: 356
GPS
|
Soy nuevo en el foro, asi que si me equivoco me lo hacen saber =) . No sabia si crear un nuevo tema, en fin. Aqui comparto unas funciones que hace tiempito hice para leer en consola, intente limitar los caracteres, si tienen sugerencias se los agradeceria. Por cierto hay alguna función estandar que haga lo mismo que getch(); para no usar la libreria conio.h, este código lo compile con Dev C++ 4.9 libreria.h#include<conio.h> // esta función lee caracteres limitando la cantidad de estos void ygets(char *c, register int n) {register char car; register int t; for(t=0; t<n ;) //lee hasta el maximo de caracteres {car=getch(); // caracter por caracter switch(car) {// si presionaste enter, ingresa caracter nulo // y termina el bucle case '\r': c[t]='\0' ;return; // si presionaste delete, retrocede, imprime espacio // y vuelve a retroceder, da la impresión que no // presionaste nada =) case '\b': if(t>0) {t-- ;printf("\b \b");}; break; // muestra lo demas y almacena en nuestra variable default: putchar(car); c[t]=car; t++; } } c[n]='\0'; } // casi lo mismo quet ygets(), pero sólo // admite numeros en el switch void LeerN(char *c, int n) {register char car; register int t; for(t=0;t<n;) {car=getch(); switch(car) {case '\r': c[t]='\0' ;return; case '\b': if(t>0) {t-- ;printf("\b \b");}; break; case '0':case '1':case '2':case '3':case '4':case '5': case '6':case '7':case '8':case '9': c[t]=car;putchar(car);t++;break; default: break; } } c[n]='\0'; } // para leer los passwords hace lo mismo que ygets() // pero muestra "*" en lugar de caracteres o.0! void leerPass(char *c, int n) {register char car; register int t; for(t=0;t<n;) {car=getch(); switch(car) {case '\r': c[t]='\0' ;return; case '\b': if(t>0) {t-- ;printf("\b \b");}; break; default: {putchar('*'); c[t]=car; t++;} } } c[n]='\0'; }
#include <stdio.h> #include <iostream> #include "libreria.h" int main(int argc, char *argv[]) { char t[15]; printf("Max 9 digitos \n"); printf("Solo numeros: "); LeerN(t,9); printf("\nnum: "); printf("%s \n",t); //----------------------- printf("\nMax 9 caracteres"); printf("\nCualquier caracter: "); ygets(t,9); printf("\nCadena: "); printf("%s \n",t); //------------------------ printf("\nMax 5 caracteres"); printf("\nLee Pass: "); leerPass(t,5); printf("\nIngreso: "); printf("%s",t); getch(); return EXIT_SUCCESS; }
|
|
« Última modificación: 10 Junio 2011, 08:30 am por Maurice_Lupin »
|
En línea
|
Un error se comete al equivocarse.
|
|
|
gowend
|
Veo que tengo que aprender mucho aun
|
|
|
En línea
|
Gowend132 El conocimiento es LIBRE!!!
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Ayudaa problema nivel basico
Programación C/C++
|
krowa
|
0
|
2,133
|
13 Marzo 2012, 23:48 pm
por krowa
|
|
|
Problema con la creación de tablas SQL nivel básico.
Desarrollo Web
|
nikko88
|
2
|
2,588
|
25 Junio 2012, 17:48 pm
por nikko88
|
|
|
[Nivel 1/10] CrackMe básico C #4
« 1 2 »
Ingeniería Inversa
|
cibergolen
|
12
|
9,761
|
30 Diciembre 2012, 22:42 pm
por cibergolen
|
|
|
[C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« 1 2 3 »
Programación C/C++
|
SoyelRobert
|
20
|
12,880
|
16 Diciembre 2013, 21:24 pm
por SoyelRobert
|
|
|
[Tutorial Nivel básico] Haciendo cantar a nuestro Crackme
Ingeniería Inversa
|
fary
|
5
|
4,366
|
6 Febrero 2016, 00:03 am
por fary
|
|