Jump to content
JoaoSkate

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

Recommended Posts

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

Edited by JoaoSkate

Share this post


Link to post
Share on other sites
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

  • Vote 1

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.