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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  |Lo que no hay que hacer en C/C++. Nivel basico|
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 3 4 [5] 6 7 Ir Abajo Respuesta Imprimir
Autor Tema: |Lo que no hay que hacer en C/C++. Nivel basico|  (Leído 164,797 veces)
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #40 en: 27 Marzo 2011, 20:45 pm »

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  :P.

Saludos

¿Y para qué crees que es el sscanf()?


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
[Zero]
Wiki

Desconectado Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #41 en: 27 Marzo 2011, 20:55 pm »

¿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 Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #42 en: 27 Marzo 2011, 20:56 pm »

Código
  1. #include <stdio.h>
  2. int main()
  3. {
  4.    unsigned int n;
  5.    char buffer[100];
  6.    do
  7.    {
  8.        printf("n : ");
  9.        fgets(buffer, 99, stdin);
  10.    } while(sscanf(buffer, "%u", &n) != 1);
  11.    printf("n : %u\n", n);
  12.    return 0;
  13. }
  14.  
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
[Zero]
Wiki

Desconectado Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #43 en: 27 Marzo 2011, 21:05 pm »

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    unsigned int n;
  6.    char buffer[10];
  7.    do
  8.    {
  9.        printf("n : ");
  10.        fgets(buffer,9, stdin);
  11.    } while(sscanf(buffer, "%u", &n) != 1);
  12.    printf("n : %u\n", n);
  13.    getchar();
  14.    return 0;
  15. }
  16.  

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 Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #44 en: 28 Marzo 2011, 10:20 am »

¿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 Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #45 en: 28 Marzo 2011, 16:24 pm »

¿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 Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #46 en: 28 Marzo 2011, 19:08 pm »

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 Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #47 en: 29 Marzo 2011, 15:38 pm »

Gracias, era lo que quería saber, ya no hay duda  ;D.

Saludos
En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
Maurice_Lupin


Desconectado Desconectado

Mensajes: 356

GPS


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #48 en: 14 Mayo 2011, 05:55 am »

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
Código
  1. #include<conio.h>
  2. // esta función lee caracteres limitando la cantidad de estos
  3. void ygets(char *c, register int n)
  4.  {register char car;
  5.   register int t;  
  6.   for(t=0; t<n ;) //lee hasta el maximo de caracteres
  7.      {car=getch(); // caracter por caracter
  8.       switch(car)
  9.         {// si presionaste enter, ingresa caracter nulo
  10.          // y termina el bucle
  11.          case '\r': c[t]='\0' ;return;
  12.          // si presionaste delete, retrocede, imprime espacio
  13.          // y vuelve a retroceder, da la impresión que no
  14.          // presionaste nada =)
  15.          case '\b': if(t>0) {t-- ;printf("\b \b");};
  16.          break;
  17.          // muestra lo demas y almacena en nuestra variable
  18.          default: putchar(car); c[t]=car; t++;
  19.         }  
  20.      }
  21.   c[n]='\0';  
  22.  }
  23.  
  24. // casi lo mismo quet ygets(), pero sólo
  25. // admite numeros en el switch
  26. void LeerN(char *c, int n)
  27.  {register char car;
  28.   register int t;
  29.   for(t=0;t<n;)
  30.      {car=getch();
  31.       switch(car)
  32.         {case '\r': c[t]='\0' ;return;
  33.          case '\b': if(t>0) {t-- ;printf("\b \b");}; break;
  34.          case '0':case '1':case '2':case '3':case '4':case '5':
  35.          case '6':case '7':case '8':case '9':
  36.               c[t]=car;putchar(car);t++;break;            
  37.          default: break;
  38.         }  
  39.      }
  40.   c[n]='\0';  
  41.  }
  42.  
  43. // para leer los passwords hace lo mismo que ygets()
  44. // pero muestra "*" en lugar de caracteres o.0!
  45. void leerPass(char *c, int n)
  46.  {register char car;
  47.   register int t;
  48.   for(t=0;t<n;)
  49.      {car=getch();
  50.       switch(car)
  51.         {case '\r': c[t]='\0' ;return;
  52.          case '\b': if(t>0) {t-- ;printf("\b \b");}; break;
  53.          default: {putchar('*');
  54.                   c[t]=car; t++;}
  55.         }
  56.      }
  57.   c[n]='\0';  
  58.  }
  59.  
  60.  

Código
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include "libreria.h"
  4.  
  5.  
  6. int main(int argc, char *argv[])
  7. {   char t[15];  
  8.  
  9.    printf("Max 9 digitos \n");
  10.    printf("Solo numeros: "); LeerN(t,9);    
  11.    printf("\nnum: "); printf("%s \n",t);
  12.    //-----------------------
  13.    printf("\nMax 9 caracteres");    
  14.    printf("\nCualquier caracter: "); ygets(t,9);
  15.    printf("\nCadena: "); printf("%s \n",t);    
  16.    //------------------------
  17.    printf("\nMax 5 caracteres");
  18.    printf("\nLee Pass: "); leerPass(t,5);
  19.    printf("\nIngreso: "); printf("%s",t);    
  20.    getch();
  21.    return EXIT_SUCCESS;
  22. }
  23.  
« Última modificación: 10 Junio 2011, 08:30 am por Maurice_Lupin » En línea

Un error se comete al equivocarse.
gowend

Desconectado Desconectado

Mensajes: 46



Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #49 en: 20 Agosto 2011, 17:59 pm »

Veo que tengo que aprender mucho aun  ;-)
En línea

Gowend132 El conocimiento es LIBRE!!!
Páginas: 1 2 3 4 [5] 6 7 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayudaa problema nivel basico
Programación C/C++
krowa 0 2,139 Último mensaje 13 Marzo 2012, 23:48 pm
por krowa
Problema con la creación de tablas SQL nivel básico.
Desarrollo Web
nikko88 2 2,596 Último mensaje 25 Junio 2012, 17:48 pm
por nikko88
[Nivel 1/10] CrackMe básico C #4 « 1 2 »
Ingeniería Inversa
cibergolen 12 9,770 Último mensaje 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,912 Último mensaje 16 Diciembre 2013, 21:24 pm
por SoyelRobert
[Tutorial Nivel básico] Haciendo cantar a nuestro Crackme
Ingeniería Inversa
fary 5 4,379 Último mensaje 6 Febrero 2016, 00:03 am
por fary
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines