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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Recibir int seguro
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Recibir int seguro  (Leído 4,405 veces)
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Recibir int seguro
« Respuesta #10 en: 9 Marzo 2014, 17:48 pm »

Una recomendación a ivance96. Para que el código sea más portable, recordemos que los tipos enteros no tienen una longitud rígidamente definida, por ejemplo en algunas máquinas (antiguas) los enteros son de 16bits, y en otras de 32bits. Si mal no recuerdo, la norma indica que la longitud de int debe estar entre la longitud de short y la de long, pero la elección entre ambos depende de la implementación. Debiendo ser la longitud de short de al menos 16 bits, y la de long de al menos 32 bits. Así que por ejemplo una implementación en particular (quizá en el futuro, para una máquina potente) pudiera tener short de 32 bits, int de 64 bits y long de 64 bits.

La biblioteca <limits.h> define los máximos posibles para los distintos tipos aritméticos según la puesta en práctica. Por ejemplo, CHAR_MAX, SHRT_MAX, UINT_MAX define los máximos de char, short int y unsigned int respectivamente, y son valores que dependen de la implementación de C en tu máquina particular. Así que el programa podría quedar algo así como:
Código
  1. /** INT && UINT **/
  2. if(s[0]=='-')
  3. sign=true;
  4. if ( allNumeric(s.substr(sign, s.size()))) {
  5. if(sign) {
  6.   if ( atoi(s.substr(1, s.size())) <= INT_MAX  )
  7. type+=type_int;
  8. }else{
  9. if ( atoi(s.substr(0, s.size())) <= INT_MAX )
  10. type+=type_int;
  11. if ( atoi(s.substr(0, s.size())) <= UINT_MAX)
  12. type+=type_uint;
  13. }
  14. }

el cual es transportable sin problemas de una máquina a otra.


« Última modificación: 9 Marzo 2014, 17:57 pm por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Recibir int seguro
« Respuesta #11 en: 9 Marzo 2014, 18:15 pm »


Lo de un número fijo era por lo de las tarjetas de crédito y cosas así. Como en este código, sencillo pero muy funcional ... y sólo admite un número determinado de caracteres, si son menos  espera hasta que se complete y no da opción de más:

Código
  1. /*Crear un programa que pida al usuario su contraseña (numérica).
  2. Deberá terminar cuando introduzca como contraseña el número
  3. 5879, pero
  4. volvérsela a pedir teniendo cuatro intentos.*/
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. int main( void )
  9. {
  10.    char clave [5];
  11.    int i,clave_num,intentos=0,DIGITOS=4;
  12.    do
  13.    {
  14.        printf ("\n\n\n\Presione una tecla para continuar: ");
  15.        fflush (stdout);
  16.        getch ();
  17.        system ("cls");
  18.        fflush (stdout);
  19.        printf ("\n\n\n   INTRODUZCA LA CLAVE  entera (cuatro digitos) \n\n\n");
  20.        printf ("Teclea la clave (1122 par salir) y presione enter para salir: ");
  21.        fflush (stdout);
  22.        for (i=0;i<DIGITOS;i++){
  23.            clave [i] =getch();
  24.            printf("*");
  25.            fflush (stdout);
  26.        }
  27.    clave [4] ='\0';
  28.    printf ("\n\n\t\t\tLA CLAVE INTRODUCIDA ES :%s",clave );
  29.    fflush (stdout);
  30.    printf ("\n\n\t\t\tLA CLAVE EN ASCII es  : ");
  31.    fflush (stdout);
  32.    for (i=0;i<4;i++){
  33.                printf ("%d - ",clave[i] );
  34.                fflush (stdout);
  35.            }
  36.  
  37.    intentos++;
  38.    clave_num = atoi (clave);
  39.    printf ("%d \n",clave_num);
  40.    if (intentos==3){
  41.            printf ("\n\n\t\tMe quedo con la tarjeta,,AGURRRRRRRRRRR\n\n");
  42.            exit (0) ;
  43.        }
  44.    }
  45.    while (clave_num!=5879);
  46.    printf ("\n\n\n\HASTA OTRA OCASION\n\n\n");
  47.    return 0;
  48. }

Como ves hay más formas de limitar el número de caracteres que los expuestos anteriormente. Este en particular el anterior "me llena", nada de tener que limpiar buffer ni cosas por el estilo.

Y perdón por el uso de getch() pero en el estándar de C no hay ninguna función similar, a no ser que se recurra a getchar() pero con una rápida limpieza de pantalla y aún así se pierden los otros datos impresos.

A mí personalmente el que fgets "meta" un retorno de carro en las cadenas me da un no sé qué .......

Y por cierto, aunque es otro tema, te he echado de menos en el hilo de los rombos. Está bastante animado y creo que aún no se ha acabado. Yo al menos me guardo un as en la manga .... y en C++ para variar.[/size]

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




En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Recibir int seguro
« Respuesta #12 en: 9 Marzo 2014, 19:50 pm »

Una recomendación a ivance96. Para que el código sea más portable, recordemos que los tipos enteros no tienen una longitud rígidamente definida, por ejemplo en algunas máquinas (antiguas) los enteros son de 16bits, y en otras de 32bits. Si mal no recuerdo, la norma indica que la longitud de int debe estar entre la longitud de short y la de long, pero la elección entre ambos depende de la implementación. Debiendo ser la longitud de short de al menos 16 bits, y la de long de al menos 32 bits. Así que por ejemplo una implementación en particular (quizá en el futuro, para una máquina potente) pudiera tener short de 32 bits, int de 64 bits y long de 64 bits.

La biblioteca <limits.h> define los máximos posibles para los distintos tipos aritméticos según la puesta en práctica. Por ejemplo, CHAR_MAX, SHRT_MAX, UINT_MAX define los máximos de char, short int y unsigned int respectivamente, y son valores que dependen de la implementación de C en tu máquina particular. Así que el programa podría quedar algo así como:
Código
  1. /** INT && UINT **/
  2. if(s[0]=='-')
  3. sign=true;
  4. if ( allNumeric(s.substr(sign, s.size()))) {
  5. if(sign) {
  6.   if ( atoi(s.substr(1, s.size())) <= INT_MAX  )
  7. type+=type_int;
  8. }else{
  9. if ( atoi(s.substr(0, s.size())) <= INT_MAX )
  10. type+=type_int;
  11. if ( atoi(s.substr(0, s.size())) <= UINT_MAX)
  12. type+=type_uint;
  13. }
  14. }

el cual es transportable sin problemas de una máquina a otra.
Si, bueno. Salvo en el float y el double, que era un terrible follón traducirlo de char* a float/double, en las otras comprobaciones lo intentaba hacer sin las funciones atoi y parecidas.
En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Recibir int seguro
« Respuesta #13 en: 10 Marzo 2014, 21:55 pm »

Hola con la ayuda de sus codigos he hecho esto:

Código
  1. #include "stdafx.h"
  2. #include <stdlib.h>
  3. #include <cctype>
  4. #include "firstTest.hpp"
  5.  
  6.  
  7. int getInt(char *msg,int max,int min){
  8. char *str=new char[max+1];
  9. do{
  10. fflush(stdout);
  11. printf("%s",msg);
  12. fgets(str,max+1,stdin);
  13. int i=-1;
  14. bool clean=true;
  15. while(str[++i]!='\0'){
  16. if(str[i]=='\n'){
  17. clean=false;
  18. str[i]='\0';
  19. }
  20. }
  21. if(clean)getchar();
  22. str=outFirstSpace(str);
  23. printf("\n");
  24.  
  25.  
  26. }while(*str=='\0' || !isInt(str) || getLength(str)<min);
  27. //while(getchar()!='\n');
  28. return atoi(str);
  29. }
  30.  
  31. char * outFirstSpace(char *str){
  32. int length=getLength(str);
  33. while(*str==' ')str++;
  34. return str;
  35. }
  36.  
  37. bool isInt(char const * const str){
  38. int length=getLength(str);
  39. for(int i=0;i<length;i++){
  40. if(!isdigit(str[i])){
  41. return false;
  42. }
  43. }
  44. return true;
  45. }
  46.  
  47. int getLength(const char * str){
  48. int l=0;
  49. while(*(str++)!='\0')l++;
  50. return l;
  51. }
  52.  

Hay un problema que si se insertan mas caracteres de los que pide fgets() luego repite el printf("%s",msg) muchas veces. No se que pasa pero no he conseguido limpiar el buffer. Sabéis como?


@Edit: Acabo de crear otro con iostream en c++

Código
  1. #include "stdafx.h"
  2. #include "secondTest.hpp"
  3.  
  4.  
  5. int getInt(string msg,int max,int min){
  6. string str;
  7. do{
  8. cout << msg;
  9. cin.clear();
  10. cin >> str;
  11. }while(!isInt(str) || str.size()>max || str.size()<min);
  12. return atoi(str.data());
  13. }
  14.  
  15. bool isInt(string str){
  16. for(size_t i=0;i<str.size();i++){
  17. if(!isdigit(str[i]))
  18. return false;
  19. }
  20. return true;
  21. }

Este no tiene problemas o por lo menos no los he descubierto.

Saludos
« Última modificación: 10 Marzo 2014, 22:34 pm por patilanz » En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Recibir int seguro
« Respuesta #14 en: 11 Marzo 2014, 03:29 am »

Leo, tu programa es ideal para el caso de una clave numérica con una cantidad exacta de dígitos, además obliga al usuario sobre meter exactamente esa cantidad.

Y respecto a los rombos, ....... tranquilo jaja que ya voy a aparecer con una idea que he estado pensando y espero sorprendente  ;D (tanto como las de todos)
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Recibir int seguro
« Respuesta #15 en: 11 Marzo 2014, 03:37 am »

El método que propones tiene un pero, si introduces 12as toma 12 como int.
En ese caso nada impide verificar el resto del stream con una lectura adicional, las funciones eof/get, etc. Por ejemplo:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include <string>
  7. using std::string;
  8. using std::getline;
  9.  
  10. #include <sstream>
  11. using std::istringstream;
  12.  
  13. int main()
  14. {
  15.   bool ok = false;
  16.   int num;
  17.  
  18.   do {
  19.      cout << "Introduce un numero: ";
  20.      string linea;
  21.      getline(cin, linea);
  22.  
  23.      istringstream is(linea);
  24.      char ch;
  25.      if (is >> num && !(is >> ch))
  26.         ok = true;
  27.      else
  28.         cout << "Entrada no valida" << endl;
  29.   }while (!ok);
  30.  
  31.   cout << "num == " << num << endl;
  32.  
  33.   return 0;
  34. }

----

La biblioteca <limits.h> define los máximos posibles para los distintos tipos aritméticos según la puesta en práctica. Por ejemplo, CHAR_MAX, SHRT_MAX, UINT_MAX define los máximos de char, short int y unsigned int respectivamente, y son valores que dependen de la implementación de C en tu máquina particular. Así que el programa podría quedar algo así como:
Código
  1. /** INT && UINT **/
  2. if(s[0]=='-')
  3. sign=true;
  4. if ( allNumeric(s.substr(sign, s.size()))) {
  5. if(sign) {
  6.   if ( atoi(s.substr(1, s.size())) <= INT_MAX  )
  7. type+=type_int;
  8. }else{
  9. if ( atoi(s.substr(0, s.size())) <= INT_MAX )
  10. type+=type_int;
  11. if ( atoi(s.substr(0, s.size())) <= UINT_MAX)
  12. type+=type_uint;
  13. }
  14. }
Un problema con ese fragmento es el uso de atoi, por razones obvias su valor de retorno no puede ser mayor a INT_MAX. Para conocer si un numero esta fuera del rango valido para un tipo entero se deben utilizar las funciones strtol, strtoll (C++11), etc. dependiendo del caso (y del modo de compilación).

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Alguien entra en mi PC (seguro seguro) me pueden ayudar?
Seguridad
BanKFull76 3 5,178 Último mensaje 9 Julio 2012, 16:15 pm
por Saberuneko
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines