reconhecer apenas letras e numeros

1. reconhecer apenas letras e numeros

jose barbosa
junior016

(usa Outra)

Enviado em 16/06/2016 - 22:05h

como fazer meu codigo reconhecer apenas letras em certa parte e apenas numeros em outras partes? é possivel com o scanf?


  


2. Re: reconhecer apenas letras e numeros

Perfil removido
removido

(usa Nenhuma)

Enviado em 16/06/2016 - 22:47h

Lendo carácter a carácter com getc()?
Tem umas funções mais obscuras que fazem isto melhor.
Mas eu me pergunto por que em Pascal é trivial e em C não é?

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



3. Re: reconhecer apenas letras e numeros

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/06/2016 - 00:46h

Você quer impedir que o usuário digite caracteres não permitidos, ou quer apenas limitar o que o programa aceita reconhecer como parte de um certo dado?

Com scanf() você consegue a segunda opção. Já a primeira possivelmente requer atuação direta sobre o terminal, o que implica que você terá de usar funções que estão além do que a biblioteca padrão lhe fornece.


4. Re: reconhecer apenas letras e numeros

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/06/2016 - 00:56h

listeiro_037 escreveu:

Mas eu me pergunto por que em Pascal é trivial e em C não é?


Sério? Será que você não está falando de algum dialeto específico de Pascal, ou com alguma biblioteca especial?

Eu sinceramente não lembro que o Pascal ISO ou o Turbo Pascal tivessem nada parecido com isso nativamente, nem mesmo na biblioteca CRT do TP7.


5. Re: reconhecer apenas letras e numeros

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/06/2016 - 01:03h

paulo1205 escreveu:

listeiro_037 escreveu:

Mas eu me pergunto por que em Pascal é trivial e em C não é?


Sério? Será que você não está falando de algum dialeto específico de Pascal, ou com alguma biblioteca especial?

Eu sinceramente não lembro que o Pascal ISO ou o Turbo Pascal tivessem nada parecido com isso nativamente, nem mesmo na biblioteca CRT do TP7.


É um comando chamado ReadKey.

Ele funcionou no Free Pascal que foi onde o utilizei quan do fiz um trabalho de criação de calculadora na matéria chamada estrutura de dados.

Basta colocar

Ch := ReadKey; 


que funciona. Não é case sensitivo.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



6. Re: reconhecer apenas letras e numeros

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/06/2016 - 01:53h

listeiro_037 escreveu:

É um comando chamado ReadKey.

Ele funcionou no Free Pascal que foi onde o utilizei quan do fiz um trabalho de criação de calculadora na matéria chamada estrutura de dados.


Então você está, sim, falando de uma função (não comando) de uma biblioteca específica (CRT, se não me engano). Tal biblioteca, embora muito comum em várias implementações de Pascal, não é (ou não era) parte da linguagem padrão. E essa função não faz a filtragem a que se referiu a pergunta original, mas tão-somente permite ler um caráter de cada vez do terminal, sem submetê-lo ao buffer de leituras feitas com Read ou ReadLn. A implementação do filtro será responsabilidade do programador.

Sendo desse jeito, pode-se ter coisa parecida também em implementações particulares do C, seja com Curses, ConIO, ou com as versões mostradas várias vezes aqui no fórum de my_getch(), que chamam recursos do sistema operacional diretamente.

EDIT: Eu disse que uma implementação de my_getch() foi mostrada várias vezes, mas no fim das contas só achei uma vez. Repito-a aqui para facilitar.

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

/*
Função que lê um caráter diretamente do terminal e
o retorna ao chamdor um valor INTEIRO (int), do seguinte
modo:

- se o valor for igual à constante EOF, então ocorreu um
erro durante a leitura;
- qualquer outro valor será maior ou igual a zero, e indicará
o código do caráter lido (ao ser convertido para char, será
o próprio caráter).

NOTA: Esta função lê caracteres, não teclas. Teclas especiais,
como Shift, Control, CapsLock, Alt, AltGr, Pause e algumas
outras podem não produzir efeito nenhum (a não ser quando
combinadas com outras teclas). Outros tipos de teclas es-
peciais, como as setas, teclas de função, Home, PageUp,
PageDown, Del, Insert, Backspace, Tab, entre outras, podem
produzir múltiplos caracteres de uma vez só. Esta função
não trata tais casos. A função getch() da Curses é mais
esperta, reconhecendo as sequências de caracteres de
algumas dessas teclas especiais, e substituindo-as por
valores de retorno específicos.
*/
int my_getch(void){
struct termios oldattr, newattr;
unsigned char ch;
int retcode;
tcgetattr(STDIN_FILENO, &oldattr);
newattr=oldattr;
newattr.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newattr);
retcode=read(STDIN_FILENO, &ch, 1);
tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);
return retcode<=0? EOF: (int)ch;
}



7. Re: reconhecer apenas letras e numeros

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/06/2016 - 04:22h

Eu me lembro da Crt.
Agora não sei se quem pede ela é o Free Pascal ou o GNU Pascal.
E nem dá prá testar. Debian Stable não tem GNU Pascal.

Mas realmente falta ver se Crt é padrão.
Este padrão é ISO 7185?

Então, a parte mais complicada era ler uma tecla.
Isso o ReadKey fazia bem.
Depois foi só colocar uma estrutura de teste para filtrar numerais e teclas de operações aritméticas.

Se realmente fizer parte do Pascal padrão, então realmente deixa a coisa a ser feita em C mais complicada.
Se não me engano era uma função tipo ioctl(), mas não me lembro de detalhes, nem se é este o nome.
Não me aprofundei.

EDIT: Encontrei: https://pt.wikipedia.org/wiki/Pascal_(linguagem_de_programa%C3%A7%C3%A3o)#Exemplos de código

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



8. Re: reconhecer apenas letras e numeros

jose barbosa
junior016

(usa Outra)

Enviado em 17/06/2016 - 10:34h

paulo1205 escreveu:

Você quer impedir que o usuário digite caracteres não permitidos, ou quer apenas limitar o que o programa aceita reconhecer como parte de um certo dado?

Com scanf() você consegue a segunda opção. Já a primeira possivelmente requer atuação direta sobre o terminal, o que implica que você terá de usar funções que estão além do que a biblioteca padrão lhe fornece.


tipo, quando o usuario inserir palavras onde eu so quero que aceite numeros, quero que o codigo repita, entende? e a mesma coisa quando o usuario inserir numeros onde eu so quero que aceite palavras



9. Re: reconhecer apenas letras e numeros

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/06/2016 - 18:11h

junior016 escreveu:

tipo, quando o usuario inserir palavras onde eu so quero que aceite numeros, quero que o codigo repita, entende? e a mesma coisa quando o usuario inserir numeros onde eu so quero que aceite palavras


Certamente é possível fazer com scanf(), mas para tanto você vai precisar a aprender a usá-la do modo correto.

A primeira coisa é que você não pode ignorar o retornado pela função. Alguns sistemas (Ubuntu, por exemplo), reclamam se você fizer apenas algo como

scanf("%d", &i); 


exigindo que você use o resultado da função numa expressão. Por exemplo:

result=scanf("%d", &i);  // Usa resultado numa expressão de atribuição. 

while(scanf("%d", &i)==1)  // Usa resultado numa expressão de comparação. 

switch(scanf("%d", &i)){  // Usa resultado numa expressão inteira.
case EOF:
/* Erro de leitura */
break;
case 1:
/* Uma conversão com atribuição realizada. */
break;
default:
/*
Menos conversões com atribuições realizadas do que presentes
na string de formatação (no nosso caso, a string só tem uma con-
versão com atribuição, logo o valor retornado por scanf() certa-
mente terá sido zero.

Como a conversão é de inteiro, a causa mais provável para cair
aqui é se o usuário tiver digitado um caráter que não um alga-
rismo. Os caracteres inválidos não são consumidos.
*/
}


A função scanf() não é simples -- eu acho que é a mais complexa função da biblioteca padrão do C. Você tem de ler sua docuemntação com muito cuidado para poder torar proveito das diferentes opções de verificação de formato e conversão de dados. às vezes você até vai querer fazer uma conversão, mas não atribuir o valor convertido a nenhuma variável. Às vezes vai querer saber quantos caracteres da entrada foram consumidos até o momento.



  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts