Jump to content
nunolevezinho

Função que devolve array de caracteres

Recommended Posts

nunolevezinho

Boas, estou a fazer uma função que lê 1 palavra de um ficheiro de texto e devolve essa palavra.

Quando corro o programa obtenho Segmentation fault (core dumped) .

Devo ter algo mal no ponteiro mas não tou a ver o quê...

char *getAdminPassword(char *filename)
   {
       FILE *file;
       char *adminPassword;

       file = fopen(filename, "r");
       if(file==NULL){
           printf("[sERVER] Nao foi possivel abrir ficheiro de administrador! Programa vai terminar\n"); exit(EXIT_FAILURE);
       }
       fscanf(file, "%s", adminPassword);
       fclose(file);
       printf("Password: %s\n", adminPassword);
       return adminPassword;
   }

int main()
{
   char *adminPassword = getAdminPassword("pass.txt");
   /* código */
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

adminPassword é um ponteiro que aponta para que ?


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

Share this post


Link to post
Share on other sites
nunolevezinho

Supostamente está a apontar para o valor que a função devolve

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok ... eu volto a fazer a mesma pergunta

char *getAdminPassword(char *filename)
   {
       FILE *file;
       char *adminPassword;                // <- para onde está a apontar o ponteiro "adminPassword"

       file = fopen(filename, "r");
       if(file==NULL){
           printf("[sERVER] Nao foi possivel abrir ficheiro de administrador! Programa vai terminar\n"); exit(EXIT_FAILURE);
       }
       fscanf(file, "%s", adminPassword);  // <- onde estás a guardar o que foi lido do ficheiro ?
       fclose(file);
       printf("Password: %s\n", adminPassword); // <- o que está a ser apresentado ?
       return adminPassword;                    // o que está a ser retornado ?
   }

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites
nunolevezinho

Ontem ha noite entretanto acabei por descobrir.

char *getAdminPassword(char *filename)
{
 FILE *file;
 char adminPassword[20];
 file = fopen(filename, "r");
 if(file==NULL)
   {
     printf("[sERVER]: Nao foi possivel abrir ficheiro de administrador! Programa vai terminar\n"); //exit(EXIT_FAILURE);
     return;
   }
 fscanf(file, "%s", adminPassword);
 fclose(file);
 return adminPassword;
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

isso pode parecer correcto, no entanto continua errado.

char *getAdminPassword(char *filename)
{
 FILE *file;
 char adminPassword[20]; // <-- estas a reservar espaço para 20 caracteres

 file = fopen(filename, "r");
 if(file==NULL)
   {
     printf("[sERVER]: Nao foi possivel abrir ficheiro de administrador! Programa vai terminar\n"); //exit(EXIT_FAILURE);
     return;
   }
 fscanf(file, "%s", adminPassword);
 fclose(file);

 // adminPassword tem na realidade a password lida do ficheiro

 return adminPassword;
}

int main()
{
   char *adminPassword = getAdminPassword("pass.txt");

   // o problema é que a memória reservada em "getAdminPassword" foi libertada no momento de retorno da função
   // o que quer dizer que "adminPassword" aponta para algures que já pode ter outro valor

   /* código */
}

o que necessitas é de reservar a memória ao nível (função) que necessitas e passar a referência dessa memória para a função que a vai utilizar


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

Share this post


Link to post
Share on other sites
nunolevezinho

Entretanto tinha-me esquecido de colocar aqui a solução. Era a isto que te referias ?

char *getAdminPassword(char *filename)
{
 FILE *file;
 char *adminPassword = malloc (sizeof (char) * 50);
 file = fopen(filename, "r");
 if(file==NULL)
   {
     printf("[sERVER]: Nao foi possivel abrir ficheiro de administrador! Programa vai terminar\n"); 
     exit(EXIT_FAILURE);
   }
 fscanf(file, "%s", adminPassword);
 fclose(file);
 return adminPassword;
}

Edited by nunolevezinho

Share this post


Link to post
Share on other sites
HappyHippyHippo

estás a fazer "free" do valor de retorno dessa função ?


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

Share this post


Link to post
Share on other sites
nunolevezinho

Não :o

Como faço free depois de fazer o return da variável?

EDIT: free(getAdminPassword(ADMIN_FILE)) ?

Edited by nunolevezinho

Share this post


Link to post
Share on other sites
HappyHippyHippo
int main()
{
 char *adminPassword = getAdminPassword("pass.txt");

 /* código */

 free (adminPassword); // já não necessito desta informação
}


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.