• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

port

Problema com leitura de info do teclado

10 mensagens neste tópico

Boas.

Tou com o seguinte problema:

Pretendo ler uma opção do teclado, introduzida por um utilizador. Passa-se que o programa convém ser robusto, ou seja, se o utilizar introduzir algum comando invalido, terei de o detectar.

O meu problema não é em detectar comandos inválidos, mas por exemplo, declaro um vector de chars com uma determinada dimensão, por exemplo 10. Ora se o utilizador lhe da' para brincar, e introduzir uma opção de + de 10 caracteres, já vou estar a escrever em memória que não me pertence, e portanto o programa termina com segmentantion fault.

Haverá alguma forma eficaz de fazer isto, sem ter que declarar um vector de chars com dimensão enorme, desperdiçando assim memória desnecessária ?

Obrigado desde já !

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

scanf("%9s",str); ou fgets(str,9,stdin);.

O fgets le so' os 9 caracteres e mete-os no vector str certo?

Eu estava a tentar evitar o fgets, porque tinha ficado com a impressao que dava um problema qualquer, já n me recordo bem qual.

De qualquer forma assim parece-me uma boa opção, mas ainda vou investigar se tem ou n alg prob.

e obrigado !!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tem o problema de poder deixar ficar caracteres no buffer por ler... Mas nesse caso só tens que o limpar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tem o problema de poder deixar ficar caracteres no buffer por ler... Mas nesse caso só tens que o limpar.

Como assim?

Eu sei a dimensao das opçoes, neste caso a dim e' 1. Se eu ler 2 caracteres do teclado, so' para ter a certeza que o utilizador nao introduziu a primeira letra da opção, e a seguir outra coisa qualquer.

O problema que estou a ver agora e' se por exemplo o utilizador introduz espaços antes da opçao, e eu lendo so' 2 caracteres, vou perder isso :|

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se tens um limite máximo para inputs válidos, a solução é muito simples: primeiro ignoras espaços, depois lês esses caracteres+1 para um buffer com fgets(), detectas se há mais caracteres por ler e, se houver, ignoras os caracteres a mais (com getchar(), por exemplo).

#include <stdio.h>
#define MAX_COMMAND_LENGTH 10
/* ... */
char buf[MAX_COMMAND_LENGTH + 2]; /* 10 + 1 extra + o '\0' */
int ch;

/* ignorar espacos */
while (isspace((unsigned char)(ch = getchar()))) /* void */;
if (ch == EOF) {
  /* error */
}
/* repor nao espaco */
ungetc(ch, stdin);
if (!fgets(buf+1, MAX_COMMAD_LENGTH + 2, stdin)) {
  /* erro ou EOF a ler stdin */
} else {
  if (strlen(buf) == MAX_COMMAND_LEN + 1) {
    if (buf[MAX_COMMAND_LEN+1] != '\n') {
      int ch;
      while (((ch = getchar()) != '\n') && (ch != EOF)) /* void */;
      /* erro, comando invalido */
    }
  }
  /* buf tem um comando, seguido de '\n' */
}

Atenção: código não testado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

que funçoes sao essas ?

isspace e ungetc ?

isso e' C ansi ?

Acho que o ideal para mim seria um misto de fscanf com fgets, que lesse um determinado nº de caracteres, e que ignorasse os espaços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isspace e ungetc ?

isso e' C ansi ?

Sim. Só me faltou o protótipo do isspace().

Para o snippet estar completo precisa dum

#include <ctype.h>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Niguem tem mais ideias ? Quanto mais susgestoes melhor ! Visto q nao gostei mt das q disseram ate' agora :|

Obrigado !

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora