stremer
(usa Arch Linux)
Enviado em 13/05/2008 - 10:56h
cara, não precisa de tudo isso que o engos falou não. Tem como esconder o caracter que esta sendo digitado (no windows usando o conio e no linux usando o termios). Eu prefiro na maior parte das vezes ler como texto e depois verificar se é valido e dar uma mensagem se não for, mas você pode somente aceitar numeros (códigos asc de 48 a 57). Como um código fala mais que mil palavras, segue um código de uma entrada de dados numérica.
(ah o código roda tanto em win qto em linux)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#ifdef WIN32
#include <windows.h>
#include <conio.h>
#else
#include <termios.h>
#endif
#ifdef WIN32
#define CHAR_ENTER 13
#else
#define CHAR_ENTER 10
#endif
int lerCarac() {
int chLido;
#ifdef WIN32
chLido = getch();
#else
struct termios oldt, newt;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
chLido = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
#endif
return chLido;
}
int main(int argc, char *argv[])
{
// Vamos ler um numero de 9 (int 32 bits) posições em uma string primeiramente
char * numeroStr = malloc(sizeof(char) * 10);
// Limpar a string
int x = 0;
for (x = 0; x < 10; x++) {
numeroStr[x] = 0;
}
printf("Entre com o numero: ");
char chLido = 0;
while (chLido != CHAR_ENTER && strlen(numeroStr) < 9) {
chLido = lerCarac();
if (chLido > 47 && chLido < 58) {
/* Numero lido */
putchar(chLido);
fflush(stdout);
numeroStr[strlen(numeroStr)] = chLido;
}
}
printf("\n");
// Ai convertemos para inteiro
int numero = atoi(numeroStr);
printf("Num: %d\n", numero);
return 0;
}