Função getchar( ) [RESOLVIDO]

1. Função getchar( ) [RESOLVIDO]

raniele ribeiro de souza
inar#inar

(usa Outra)

Enviado em 03/03/2009 - 17:06h

Gostaria de saber o código de da função getchar() ou como fazer uma função para ler uma string do teclado só usando os operadores básicos de C.


  


2. MELHOR RESPOSTA

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 04/03/2009 - 12:09h

São coisas diferentes.

getchar é para ler UM caractere, semelhante ao getch ou fgetc.

cgets é para ler uma string e ele o faz de forma DIFERENTE do que seria uma string em C.

Já o simples gets lê uma string normal, mas padece com problemas de buffer overflow.

getchar: le um caracter do teclado e retorna ele.

letra = getchar();

Efeito semelhante pode ser feito com:
letra = fgetc(stdin);

cgets: le uma string, mas o formato de string que ele trabalha é MUITO DIFERENTE. Leia com cgets e não poderá usar funções como strcmp, strcpy, str*, pois o formato de string trabalhada com o cgets é este:

[0]: posição 0 do vetor. Deve ser colocada o tamanho máximo de cars que ela aceita

[1]: posição 1 do vetor. O cgets irá completar colocando o tamanho (numero de letras) atual da string

[2]: posição 2. A partir dai começa realmente a string.

Exemplo:

char str1[200];

str1[0]=199; // só pode ter 199

cgets(str1);
/* Digamos que o usuário digitou "OI"

str1[0] terá 199
str1[1] terá 2
str1[2] terá 'O'
str1[3] terá 'I'
str1[4] terá 0
*/

O cgets é muito incomum. Pessoalmente não imagino sua necessidade.


3. incremento

raniele ribeiro de souza
inar#inar

(usa Outra)

Enviado em 04/03/2009 - 11:33h

gostaria de saber também sobre o código de cgets.obrigado.


4. Re: Função getchar( ) [RESOLVIDO]

Ronaldo Faria Lima
ron_lima

(usa Slackware)

Enviado em 05/03/2009 - 17:23h

Sim, é possível. No entanto, será necessário realizar chamadas de sistema para realizar a leitura de informações do teclado, e isso é amplamente dependente de plataforma. Tenha em mente que a biblioteca STDC - getchar é uma função que pertence ao padrão - isola seu programa da dependência da plataforma.

Uma forma de fazer isso é escrever a getchar como segue:
#include "sys/stat.h"
#include <fcntl.h>

int my_getchar (void) {
int fd = open ("/dev/tty", O_RDONLY);
if (fd > 0) {
int ch;

read (fd, &ch, sizeof (ch));
close (fd);
return ch;
}
return -1;
}

Essa versão é essencialmente ruim. Mas vamos aos princípios. Normalmente, /dev/tty é o terminal corrente. As funções open, read e close não fazem parte da biblioteca C e são chamadas de sistema. Em outras palavras, fazem parte da API do sistema operacional. Neste caso, como estamos tratando de um sistema "unix like" como o linux, as chamadas para leitura dos dados do teclado são essas.

No caso do sistema Windows, você deverá utilizar as funções da API Win32 ou Win64 (que são basicamente a mesma coisa, mas com tamanhos binários distintos) que se referem ao console.

Note, não há como escapar de ir ao sistema operacional e chamar algum serviço dele neste caso em particular. Afinal, o controle de entradas e saídas de dados está nas mãos do sistema operacional. Essa função que demonstra o princípio aqui é totalmente não-portável, pois as chamadas de sistema são específicas para o linux. Portanto, se você precisar portar essa função para outra arquitetura de sistema operacional, como Open Solaris, Tru64 ou HPUX, os princípios aqui apresentados podem mudar completamente.

Espero ter ajudado.


5. Re: Função getchar( ) [RESOLVIDO]

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 05/03/2009 - 18:19h

algumas implementações da libc tratam getchar como uma função ordinária, outras como uma macro - através do já mencionado getc(stdin).
seja como for, lá nas entranhas da coisa você acabará por se deparar com código dependente de arquitetura - como também já mencionado - visto que o teclado é capturado através de interrupções.

creio que esteja interessado na implementação de getchar na glibc. nesse caso, dê uma olhada no código fonte, dentro da libio:
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/libio/?cvsroot=glibc

é uma tarefa, digamos assim, reversa: terá que voltar no código e destrinchar a glibc atrás das pequenas rotinas que compõem getchar.
como uma dica, admitindo-se um padrão pc, você pode implementá-la através de int 16h.


6. cgets X gets

raniele ribeiro de souza
inar#inar

(usa Outra)

Enviado em 05/03/2009 - 18:21h

olah pessoal!

obrigado elgio por mostrar as diferencas entre as func. eu usei cgets pq ele n permite ultrapassar o limite da string num vetor de caracteres. n encontrei uma maneira de limitar uma string usando gets. porem eu n consegui me livrar dos enderecos [0] e [1] na impressao usando cgets. eh possivel imprimir um vetor de caracteres em cgets que n apareca aqueles enderecos????

obrigado ron por me mostrar como fazer um codigo da func getchar. pelo que eu entendi eh preciso acessar o SO e entender de API dos SO's (por enquanto ainda estou usando plataforma windows). A func gets e cgets e qualquer func de leitura seguem a mesma ideia????
Aprendi um monte com vcs.

Mas eu gostaria ainda de saber como fazer um codigo de leitura como gets e cgets.

Desculpe pessoal, o meu teclado esta desconfigurado por isso a falta de acentos.


7. ola

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 05/03/2009 - 18:40h

somente para complementar.
eu precisei fazer um aplicativo que fizesse leitura de caracteres no Mac/Solaris e Linux... de forma que o caractere não ecoasse na tela (para fazer uma digitação de senha com *). Como não consegui usar o getch (que é da conio.h do dos/win) o getc estava ecoando os chars, achei uma função muito legal, usando o termios.h:

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;
}

Você deve fazer um include no começo do programa:
#ifdef WIN32
#include <windows.h>
#include <conio.h>
#else
#include <termios.h>
#endif

Ai para usar, por exemplo se estiver lendo uma senha e quiser colocar um asterisco na tela:
char chLido = 0;
while (chLido != CHAR_ENTER && strlen(senha) < 101) {
chLido = lerCarac();
if (chLido > 27) {
putchar(42);
fflush(stdout);
senha[strlen(senha)] = chLido;
}
}

Agora só uso ela!!!

Parece que o termios.h é algo parecido com o principio que o amigo falou de ler o terminal.

é isso mesmo???


8. Re: Função getchar( ) [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 05/03/2009 - 18:58h

Como disse, o cgets é horrivel, mas se queres, vá lá!

char str1[203]; // ate 220 cars

str1[0]=200;
cgets(str1);

printf("Voce digitou %s \n", &str[2]);



9. cgets

raniele ribeiro de souza
inar#inar

(usa Outra)

Enviado em 05/03/2009 - 19:04h

obrigado Elgio! vou implementar no meu codigo sua dica.


10. libio

raniele ribeiro de souza
inar#inar

(usa Outra)

Enviado em 09/03/2009 - 17:51h

mslomp eu fui naquele site da libio, mas eu n descobri como ver o código da função getchar, eu clique em getchar e apareceu um monte de coisas pra baixar. como eu procedo? qual deles eu baixo pra ver?

obrigado!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts