Jump to content

Função que devolve array de caracteres


nunolevezinho

Recommended Posts

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 */
}
Link to comment
Share on other sites

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

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;
}
Link to comment
Share on other sites

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

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
Link to comment
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.