Return a string in C

Asked

Viewed 449 times

-1

Good morning, I want to return a word that is in a file,.

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

int *abrir_arquivo(){
     //o cursor ira percorrer as letras do arquivo
    int cursor,i;
   // Reserva memória que não será desalocada, para armazenar 20 chars
    char *palavra = malloc(sizeof(char) * 20);

    //O arquivo de palavras que sera lido
    FILE *file;
    //abrindo o arquivo
    file=fopen("Frutas forca.txt", "r");
    //se o arquivo for encontrado
    i=0;
    //Vendo se o arquivo foi encontrado
    if(file){
        //o cursor ira pegar cada caractere do arquivo e adicionar na variavel palavra
        while((cursor=fgetc(file))!=EOF){
            palavra[i]=cursor;
            i++;
        }
         // Adiciono um "null terminator", em C ele é interpretado como fim da string
        palavra[i]= '\0';

    //MOstrando o conteudo do arquivo
    printf("%s",palavra);
        //fecha o arquivo
        fclose(file);

    }

return palavra;
}


int main()
{

    char *palavraforca;

    *palavraforca=abrir_arquivo();
    printf("%s",palavraforca);













    return 0;
}

1 answer

0

You won’t be able to return a string this way in C, there are some concepts you should understand to accomplish what you are trying to do.

A string is just an array of bytes.

The variable palavra does not store the entire string, but a pointer pointing to the beginning of the byte array.

How do you declare your string as char palavra[20], the memory to store this array will be reserved in the stack/pilha.

This area of memory is out of focus when the function ends.

This means that if you return a pointer to that area of memory, it will be invalid as the memory has been displaced. In order to be able to return a string, or rather, a pointer to where your string starts, you need to allocate it in a memory region that will not be automatically displaced at the end of the function. Use the malloc for that reason:

// O retorno é do tipo char*, um ponteiro
char *abrir_arquivo() {
     // O cursor irá percorrer as letras do arquivo
    int cursor, i;
    // Reserva memória que não será desalocada, para armazenar 20 chars
    char *palavra = malloc(sizeof(char) * 20);

    // O arquivo de palavras que sera lido
    FILE *file;
    // Abrindo o arquivo
    file = fopen("Frutas forca.txt", "r");
    // Se o arquivo for encontrado
    i = 0;
    // Vendo se o arquivo foi encontrado
    if (file) {
        // O cursor ira pegar cada caractere do arquivo e adicionar na variável palavra
        while ((cursor = fgetc(file)) != EOF) {
            palavra[i] = cursor;
            i++;
        }
        // Adiciono um "null terminator", em C ele é interpretado como fim da string
        palavra[i] = '\0';
        // Mostrando o conteudo do arquivo
        printf("%s", palavra);
        // Fecha o arquivo
        fclose(file);

    }

    return palavra;
}
  • but how will I return in main? type:main(){palavraforca=function?

  • In the same way you return any other value: char *palavraforca = abrir_arquivo();

  • I’ve changed, and it’s not working, I’ve edited the code with your suggestions,

  • @Lolzeiro, you did wrong. If you’re going to declare char *palavraforca; on one line, and then starting on another line, you should use palavraforca = abrir_arquivo(); asteriskless.

  • vlw Yo, it worked here kkk,was early wanting to do, thank you very much!!

  • An important detail is that it is not necessary to use dynamic allocation in this case, in which the string size is known at compile time. One possibility is, for example, to declare the function as void abrir_arquivo(char palavra[], int tamanho), delegating the allocation of the chars array to the function caller. He can then choose whether to allocate statically (stack) or dynamically.

Show 1 more comment

Browser other questions tagged

You are not signed in. Login or sign up in order to post.