Duda solo ingresar numeros

Iniciado por meaf75, 10 Abril 2016, 17:53 PM

0 Miembros y 1 Visitante están viendo este tema.

HardForo

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

Soy demasiado novatillo y te quiero consultar por esto:


int isInteger(char possibleNumber[]){

    while(*possibleNumber){
        if(!isdigit(*possibleNumber))return 0;
        possibleNumber++;
    }
    return 1;
}


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!
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

MAFUS

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.


#include <stdio.h>
#include <ctype.h>
#include <termios.h>

static struct termios old, new;

void init_terminal() {
    tcgetattr(0, &old); /* old <- configuración actual del terminal
                         * el 0 en el primer argumento es el descriptor
                         * de archivo de stdin.
                         */
    new = old;          /* new copia el terminal original */
    new.c_lflag &= ~ICANON;      /* Modo no canónico: la entrada se acepta
                                  * caracter a caracter en vez de línea a
                                  * línea.
                                  */
    new.c_lflag &= ~ECHO;        /* No hay eco del carácter introducido */
    tcsetattr(0, TCSANOW, &new); /* Se guarda el nuevo comportamiento
                                  * del terminal para usarlo a partir
                                  * de ya.
                                  */
}

void reset_terminal() {
    tcsetattr(0, TCSANOW, &old); /* Se vuelve al comportamiento original */
}

int getnum() {
    int num = 0;
    int pos = 0;
    int negative = 0;
    char c;
   
    init_terminal(0);
    while((c = getchar()) != '\n') {
        if(pos == 0 && c == '-') {
            putchar('-');
            negative = 1;
            ++pos;
        }
        if(c == 127 && pos) { /* 127 es la tecla retroceso */
            num /= 10;
            putchar('\b');
            putchar(' ');
            putchar('\b');
            --pos;
        }
        if(isdigit(c)) {
            putchar(c);
            num *= 10;
            num += c - '0';
            ++pos;
        }
    }
    if(negative)
        num = -num;
    reset_terminal();
    putchar('\n');
    return num;
}

int main()
{
    int num;
    printf("Introduzca un número: ");
    num = getnum();
    printf("%i", num);
   
    return 0;
}

crack81

Hola boctulus, bueno me preguntas porque declare el parámetro como: 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  arreglo[][10] aqui ya tiene un sentido un poco mas profundo.

En fin si tu declaras tu funcion asi 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: 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 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 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...
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

HardForo

Gracias crack, no sabia del azucar sintáctico que hace posible declarar un array como puntero pero como dices, tiene sentido  ;D
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

HardForo

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

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *