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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda solo ingresar numeros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Duda solo ingresar numeros  (Leído 7,487 veces)
HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Duda solo ingresar numeros
« Respuesta #10 en: 16 Abril 2016, 13:57 pm »

@crack81 : me gustó mucho tu implementación  ;-)

Soy demasiado novatillo y te quiero consultar por esto:

Código
  1. int isInteger(char possibleNumber[]){
  2.  
  3.    while(*possibleNumber){
  4.        if(!isdigit(*possibleNumber))return 0;
  5.        possibleNumber++;
  6.    }
  7.    return 1;
  8. }
  9.  

char possibleNumber[] es un array, cierto ? porque no lo declaras como puntero a char (char*) sino con []

Sin embargo,... luego usas possibleNumber como si fuera un puntero (*possibleNumber) y por ello termino confundido  :o


Si me lo explicas serias muy amable  :xD

Gracias desde ya!


En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Duda solo ingresar numeros
« Respuesta #11 en: 16 Abril 2016, 16:00 pm »

Solución para Linux en compilador GCC, posiblemente funcione em MINGW para Windows ya que es un port de GCC.

El corazón del programa es la función getnum que sólo recibe números decimales (del 0 al 9) desde el teclado y devuelve un entero (int) con el valor igual al número introducido.

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <termios.h>
  4.  
  5. static struct termios old, new;
  6.  
  7. void init_terminal() {
  8.    tcgetattr(0, &old); /* old <- configuración actual del terminal
  9.                          * el 0 en el primer argumento es el descriptor
  10.                          * de archivo de stdin.
  11.                          */
  12.    new = old;          /* new copia el terminal original */
  13.    new.c_lflag &= ~ICANON;      /* Modo no canónico: la entrada se acepta
  14.                                   * caracter a caracter en vez de línea a
  15.                                   * línea.
  16.                                   */
  17.    new.c_lflag &= ~ECHO;        /* No hay eco del carácter introducido */
  18.    tcsetattr(0, TCSANOW, &new); /* Se guarda el nuevo comportamiento
  19.                                   * del terminal para usarlo a partir
  20.                                   * de ya.
  21.                                   */
  22. }
  23.  
  24. void reset_terminal() {
  25.    tcsetattr(0, TCSANOW, &old); /* Se vuelve al comportamiento original */
  26. }
  27.  
  28. int getnum() {
  29.    int num = 0;
  30.    int pos = 0;
  31.    int negative = 0;
  32.    char c;
  33.  
  34.    init_terminal(0);
  35.    while((c = getchar()) != '\n') {
  36.        if(pos == 0 && c == '-') {
  37.            putchar('-');
  38.            negative = 1;
  39.            ++pos;
  40.        }
  41.        if(c == 127 && pos) { /* 127 es la tecla retroceso */
  42.            num /= 10;
  43.            putchar('\b');
  44.            putchar(' ');
  45.            putchar('\b');
  46.            --pos;
  47.        }
  48.        if(isdigit(c)) {
  49.            putchar(c);
  50.            num *= 10;
  51.            num += c - '0';
  52.            ++pos;
  53.        }
  54.    }
  55.    if(negative)
  56.        num = -num;
  57.    reset_terminal();
  58.    putchar('\n');
  59.    return num;
  60. }
  61.  
  62. int main()
  63. {
  64.    int num;
  65.    printf("Introduzca un número: ");
  66.    num = getnum();
  67.    printf("%i", num);
  68.  
  69.    return 0;
  70. }


En línea

crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: Duda solo ingresar numeros
« Respuesta #12 en: 16 Abril 2016, 16:08 pm »

Hola boctulus, bueno me preguntas porque declare el parámetro como:
Código
  1. char possibleNumber[]
y no por un puntero a char, bueno la respuesta es que son lo mismo.
Cuando tu le indicas que le vas a pasar un arreglo como paremetro realmente le estas indicando que le estas pasando un puntero no importa el tipo de dato, la cosas cambia cuando es mas un de una dimension ejemplo 
Código
  1. arreglo[][10]
aqui ya tiene un sentido un poco mas profundo.

En fin si tu declaras tu funcion asi
Código
  1. int isInteger(char *possibleNumber)
no afecta en nada, ahora con respecto a porque trato  a possibleNumber como un puntero es que realmente es un puntero.

Cuando hago:
Código
  1. while(*possibleNumber)
estoy hanciendo varias operaciones una con el asterisco le estoy diciendo que me de el contenido de la direccion a donde esta apuntado la variable y al estar dentro de un while al mismo tiempo estoy haciendo una comparación booleana ya que en C o C++ el 1 significa true y el 0 False, asi que cuando accedo al contenido todo lo que sea diferente a 0 sera como decir
Código
  1. while(true)
.

Ahora hay que recordar que todas la cadenas en C o C++ "deberian" estar terminadas en nulo osea en CERO por ende el while vas a estar interando hasta que encuentre el final de la cadena osea hasta que encuentre el CERO

Pero es importante hacer esto
Código
  1. possibleNumber++
ya sino lo hacemos estariamos metidos en un bucle infinito ya que  possibleNumber++; lo que hace es apuntar a un siguiente caracter.

Bueno el tema es interesante si quieres saber mas detalladamente esto seria bueno hecharle una mirada a la artimetica de punteros y como manipular cadenas en C

Salutos...
En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Duda solo ingresar numeros
« Respuesta #13 en: 16 Abril 2016, 17:05 pm »

Gracias crack, no sabia del azucar sintáctico que hace posible declarar un array como puntero pero como dices, tiene sentido  ;D
En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Duda solo ingresar numeros
« Respuesta #14 en: 29 Abril 2016, 21:04 pm »

@LaiaxanIV : la idea está bien pero tiene una falla, creo es el valor por defecto del boolean

En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines