Vetor de caracteres [RESOLVIDO]

1. Vetor de caracteres [RESOLVIDO]

Lucas jose Pereia de Araujo
LucasJPA

(usa Debian)

Enviado em 20/09/2017 - 03:26h

Caros quero ler caracteres via teclado e armazenar em um vetor cada um ate que o usuario tecle ESC, eis o codigo:
#include <stdio.h>

#define MAX 20
#define ESC 27

int main() {

char letras[MAX];
char inverso[MAX];
int i;

for(i = 0; i <= MAX; i++) {

printf("\nLetra %d: ", i);
scanf("%c", &letras[i]);

if(letras[i] == ESC)
break;
}

return 0;

}


O problema é que na hora da execução acontece isso:

Letra 0: w

Letra 1:
Letra 2: r

Letra 3:
Letra 4: f

Letra 5:
Letra 6: ^[

ele nao lê todas as ocorrencias, por que isso esta acontecendo e como posso resolver ?


  


2. Re: Vetor de caracteres

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/09/2017 - 05:14h

Para cada caráter que você digita, tem de apertar também a tecla «Enter», certo?

Esse «Enter» aparece como um caráter que é lido na operação de leitura seguinte. Se você quiser descartá-lo, tem de fazer isso explicitamente no seu código.


3. Re: Vetor de caracteres [RESOLVIDO]

Lucas jose Pereia de Araujo
LucasJPA

(usa Debian)

Enviado em 21/09/2017 - 01:52h

obrigado pelas dicas. Eu resolvi com o comando __fpurge para limpar o buffer.


4. Re: Vetor de caracteres [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/09/2017 - 14:11h

Essa é uma solução muito particular para o Linux, que não funciona em nenhum outro sistema, mesmo do ramo UNIX/POSIX.

Você realmente quer ter de apertar <Enter> após cada tecla, ou gostaria de uma resposta mais imediata a cada tecla apertada? Se quiser respostas imediatas, veja sobre a função getch() da biblioteca curses, ou procure neste fórum por uma implementação de my_getch(), que usa apenas as funções de baixo nível do terminal. Note porém que essa versão usará recursos específicos do sistema operacional, e não será facilmente portável para outros sistemas, especialmente os que não forem compatíveis com POSIX.

Se quiser uma função portável para qualquer sistema, provavelmente terá de abrir mão da resposta imediata a cada tecla. Ela funcionará de modo mais ou menos parecido com o que você tem hoje, mas sem depender de __fpurge(). Para tanto, basta fazer o seguinte no lugar da chamada a scanf() no programa original.

if(scanf("%c%*1[\n]", &letras[i])<1){
/* Erro de leitura. SUponho que você vai querer sair do loop. */
break;
}


Isso é exatamente equivalente ao seguinte código.

{
int ch; /* Sim, o tipo é realmente int. */
if((ch=getchar())==EOF){
/* Erro de leitura. Interrompo o loop. */
break;
}
letras[i]=ch; /* O int é convertido para char aqui. */
if((ch=getchar())!=EOF && ch!='\n'){
ungetc(ch, stdin);
}
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts