Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

JoaoSkate

[Dúvida] Funçoes com ponteiros e fgets

Mensagens Recomendadas

JoaoSkate    0
JoaoSkate

Boa noite, estou aqui com algumas duvidas na resoluçao de um problema:

Eu quero ler várias comandos com o getchar, ou com scanf, comandos esses compostos por uma unica letra, x, y ou z, depois de lido o comando eu quero executar instruçoes dentro de 'cada case', no caso do comando ser x quero reservar memoria para depois ler uma frase completa com o fgets() e logo de seguida quero substituir todas as posiçoes desse vetor alocado pela letra a. Os problemas são:

1. quando alloco memoria para o vetor frase, ele só existe nessa função, como posso depois usar esse mesmo vetor ' frase' noutra função

2. quando leio o comando x e clico <enter> o compilador lê também o '\n' e faz com que o f gets acabe logo com esse '\n', como posso contornar esse problema.

Deixo o meu código em baixo, se alguem puder dar uma ajuda.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void percorre_vetor_alocado();
void aloca();

int main(){
int variavel;

do {
 variavel = getchar();
 switch(variavel) {
 case 'x': { aloca();  percorre_vetor_alocado(); break; }
 case 'y': {  break; }
 }
}
while(variavel != 'z');
return 0;
}



void aloca(){
char *frase = (char*) malloc(sizeof(char)*100);
fgets(frase,100,stdin);
}

void percorre_vetor_alocado(){
int i=0;
aloca();
for(i= 0 ; i <= 100 ; i++){
 *(frase + i) == a;
}

Editado por JoaoSkate

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo    1151
HappyHippyHippo

1. quando alloco memoria para o vetor frase, ele só existe nessa função, como posso depois usar esse mesmo vetor ' frase' noutra função

a memória alocada dentro de uma função através do uso da função malloc está acessível em qualquer altura da aplicação )até ser chamada a função free sobre a memória alocada, obviamente).

o teu problema é que no teu código, perdes a referência a essa memória ao terminar a função e não "fazeres nada" com o ponteuro.

a única coisa que necessitas de fazer é retornar ese ponteiro:

void* aloca(size_t size)
{
 char* frase = malloc(size);
 if (!fgets(frase, size, stdin))
 {
   free(frase);
   frase = NULL;
 }
 return frase; // <-- agora tens de guardar o retorno da função e libertar quando já não necessitas
}

2. quando leio o comando x e clico <enter> o compilador lê também o '\n' e faz com que o f gets acabe logo com esse '\n', como posso contornar esse problema.

o compilado não lê nada da consola, quem lê é a tua aplicação.

o que pretendes é o que se chama de limpeza do buffer de leitura/entrada.

uma solução muito simples para o teu problema é nunca usar o scanf directamente no buffer de entrada e usar sempre o fgets. isto leva a que (dentro de certas limitações) o caracter '\n' é sempre lido para o buffer usado.

exemplo:

#define BUFFER_SIZE 256

char buffer[bUFFER_SIZE];
char option;
fgets(buffer, BUFFER_SIZE, stdin);
sscanf(buffer, "%c", &option);

existem outras abordagens, mas acho que para uma pessoa que está a começar, esta é a mais simples e perceptível abordagem

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.