Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Aislan Silva Costa

C Retornar Matriz bidimensional apos chama de funcao

Recommended Posts

Numa formulação genérica, tenho uma função que coloca um valor numa matriz de strings; só como exemplo:

 char **matrizExemplo()

{

char **vet;

char tamVetor = 1;

 

vet = malloc(sizeof(char*)*tamVetor);

 

vet[0] = malloc(sizeof(char*)*10);

 

strcpy(vet[0], "teste");

 

printf("Dentro da funcao vet[0] e %s\n", vet[0]);

 

return vet; }

 

int main()

{

 

char **retorno;

 

retorno = matrizExemplo();

printf("Retorno e: %s\n", retorno[0]); return 0;

}

 

Consigo printar dentro da função o vet[0], mas ao retornar para a main ocorre falha de segmentação, onde estou errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro que vi no seu código é que você não usou free() para liberar a memória que foi alocada dinamicamente. Mas fora isso, no site onlinedb o código compilou e rodou normalmente sem falha de segmentação:

 

https://onlinegdb.com/r1SgOmgfX

 

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

char **matrizExemplo()
{
    char **vet;
    
    char tamVetor = 1;
    vet = malloc(sizeof(char)*tamVetor);
    vet[0] = malloc(sizeof(char)*10);
    strcpy(vet[0], "teste");
    
    printf("Dentro da funcao vet[0] e: %s\n", vet[0]);

    return vet;
}

int main()
{
    char **retorno;

    retorno = matrizExemplo();

    printf("Retorno e: %s\n", retorno[0]);
    
    free(retorno[0]);
    free(retorno);
    
    return 0;
}

 

(Leia minha assinatura abaixo para ver como postar códigos no fórum.)

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelo contato! Então, esse codigo funciona sim, o problema e que estou com uma implementação aqui que da falha de segmentação, pode conferir pra mim aonde e o erro?

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "/opt/azulaoServer/headers/urls.h"


typedef struct endereco
{
  char logradouro[30];
  char numero[4];
  char bairro[20];
  char estado[2];
  char cidade[30];
  char cep[15];
  }Endereco;

typedef struct Cliente
    {

     char cpf[13];
    char realName[60];
    char sexo[11];
    char key[15];
    char data[11];
    Endereco endereco;

}Cliente;



   char **QuebrarStringCompleta(char *string)
  {

   char **linha;
   char *token;
   int tamVetor = 1;

   int i = 0;

          linha  = malloc(sizeof(char*)*tamVetor);

   linha[i] = malloc(sizeof(char**)*150);

   token = strtok(string, "\n");

   strcpy(linha[i], token);
   printf("primeira linha e: %s\n", linha[i]);

   i++;
   tamVetor++;


while (token != NULL)
    {


    linha = realloc(linha, sizeof(char*)*tamVetor);

   linha[i] = malloc(sizeof(char**)*150);

   token = strtok(NULL, "\n");

   strcpy(linha[i], token);
   printf("linha e: %s\n", linha[i]);

   i++;       
   tamVetor++;




            }
   printf("chegamos antes do return\n");
  return linha;
   }



  Cliente QuebrarStruct( char *string)
 {
    printf("a fincao foi chamda para quebrar a strict\n");

    printf("a string aqui e : %s\n", string);

Cliente cliente;
char *token;

token = strtok(string,",");
 printf("passou telo token, ele e %s\n", token);
    strcpy(cliente.cpf, token);

        printf("cliente.cpf e: %s\n", cliente.cpf);

        token = strtok(NULL,",");
printf("passou telo token e: %s\n", token);
    strcpy(cliente.realName, token);

        printf("cliente.realName e: %s\n", cliente.realName);


        token = strtok(NULL,",");
     printf("passou pelo token de separar o sexo\n");
    strcpy(cliente.sexo, token);
    printf("antes do printf\n");
    printf("sexo do cliente e: %s\n", cliente.sexo);

    /*
        token = strtok(NULL,",");

    strcpy(cliente.email, token);

    */
    printf("antes do tokrn, para separar a data\n");
        token = strtok(NULL,",");
        printf("passou pelo token de separar a data\n");

    strcpy(cliente.data, token);
        printf("data do cliente e: %s\n", cliente.data);

        printf("dados e, usuario: %s, nome real: %s, sexo: %s, data: %s\n", cliente.cpf,cliente.realName, cliente.sexo, cliente.data);
    return cliente;

}




char * LerDados(int flag)
{

Cliente cliente;

FILE *users;                // cria variável ponteiro para referenciar na 
                            // memoria um tipo de arquivo txt, no caso o
                            // user.txt





// url q se encontra o arquivo users.txt


// # define BUFFER_SIZE 1024 
// char buf [ BUFFER_SIZE ] ; 



// abrindo o arquivo com tipo de abertura w

 if (flag == 1)
 {  
  users = fopen(url, "r");

 }
 if (flag == 2)
{
users = fopen(urlprodutos,"r");

}

if (flag == 4)
{
    users = fopen(urladmin,"r");

}

if (flag == 5)
{
    users = fopen(urladminsKeys,"r");

}
    char *auxiliar;


// testando se o arquivo foi realmente criado
 if (users == NULL)
 {
    printf("Erro na abertura do arquivo!");
    return 1;
  }
  else
  {

    char *lido;



    int i = 0;
    char *string;
    int tamVetor = 0;

    int a = 0;
    char *string2;
    int tamVetor2 = 0;

            char *pch;
    char *token;
    char comparador[15];

        int flag = 1;

        strcpy(auxiliar,"");

    string = malloc(sizeof(char **) * tamVetor);


    string2 = malloc(sizeof(char **) * tamVetor2);

     while ((lido = fgetc(users)) != EOF)
    {
        if (lido == '#')
        {

            while ((lido = fgetc(users)) != EOF)
            {

    printf("lido tem: %c\n", lido);
                string[i] = lido;
                                    strcat (auxiliar, string);
//      printf("copiou\n");

                tamVetor++;

                string = realloc(string, sizeof(char *) * tamVetor);



                            }
                    }
             }
            printf("String e : %s\n", auxiliar);

    }


            return auxiliar;

}



int main ()

 {


 char *string;
 char **result;



 string = LerDados(1);

 printf("String e %s: ", string);


 result = QuebrarStringCompleta(string);

//result = matrizExemplo();
 printf("as linhas separadas sao: ");

 for(int i = 0; i < 5; i++)
{
  printf("%s\n", result[i]);   

} 
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Aislan Silva Costa Olá. Sem acesso ao arquivo "users.txt" não tem como testar o código.

Mas é bem provável q o problema esteja no modo como você está alocando memória nas funções do seu código. Sem dizer q também não está liberando a memória alocada.

Obs: É conveniente e até mesmo um boa prática d programação inicializar os ponteiros com o valor NULL, para q dessa forma eles não sejam "ponteiros selvagens" ou "ponteiros soltos", como também, após fazer uso dos ponteiros, fazer novamente q os mesmos apontem para NULL (Lugar nenhum) !

Daria p passar o arquivo ou o conteúdo dele para ver se dá p resolver o exercício?

adicionado 3 minutos depois
Em 26/06/2018 às 17:58, isrnick disse:

(Leia minha assinatura abaixo para ver como postar códigos no fórum.)

É. Ajudaria muito fazer uso do botão <> Code para postar um código

Até!

Compartilhar este post


Link para o post
Compartilhar em outros sites

No compilador online está dando esse erro:

getc.c: No such file or directory

adicionado 6 minutos depois

Testa p ver se melhora um pouco. Sem poder ler o arquivo fica difícil:

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

typedef struct endereco
{
    char logradouro[30];
    char numero[4];
    char bairro[20];
    char estado[2];
    char cidade[30];
    char cep[15];
} Endereco;

typedef struct Cliente
{

    char cpf[13];
    char realName[60];
    char sexo[11];
    char key[15];
    char data[11];
    Endereco endereco;

} Cliente;



char **QuebrarStringCompleta(char *string)
{

    char **linha = NULL;
    char *token;
    int tamVetor = 1;

    int i = 0;

    linha  = malloc(sizeof(char*)*tamVetor);

    linha[i] = malloc(sizeof(char)*150);

    token = strtok(string, "\n");

    strcpy(linha[i], token);
    printf("primeira linha e: %s\n", linha[i]);

    i++;
    tamVetor++;

    while (token != NULL)
    {
        linha = realloc(linha, sizeof(char*)*tamVetor);

        linha[i] = malloc(sizeof(char)*150);

        token = strtok(string, "\n");

        strcpy(linha[i], token);
        printf("linha e: %s\n", linha[i]);

        i++;
        tamVetor++;
    }
    printf("chegamos antes do return\n");

    return linha;
}


Cliente QuebrarStruct( char *string)
{
    printf("a fincao foi chamda para quebrar a strict\n");

    printf("a string aqui e : %s\n", string);

    Cliente cliente;
    char *token = NULL;

    token = strtok(string, ",");
    printf("passou telo token, ele e %s\n", token);
    strcpy(cliente.cpf, token);

    printf("cliente.cpf e: %s\n", cliente.cpf);

    token = strtok(string, ",");
    printf("passou telo token e: %s\n", token);
    strcpy(cliente.realName, token);

    printf("cliente.realName e: %s\n", cliente.realName);


    token = strtok(string, ",");
    printf("passou pelo token de separar o sexo\n");
    strcpy(cliente.sexo, token);
    printf("antes do printf\n");
    printf("sexo do cliente e: %s\n", cliente.sexo);

    printf("antes do tokrn, para separar a data\n");
    token = strtok(string, ",");
    printf("passou pelo token de separar a data\n");

    strcpy(cliente.data, token);
    printf("data do cliente e: %s\n", cliente.data);

    printf("dados e, usuario: %s, nome real: %s, sexo: %s, data: %s\n", cliente.cpf,cliente.realName, cliente.sexo, cliente.data);
    return cliente;
}


char * LerDados(int flag)
{

    Cliente cliente;

    FILE *users;

    if (flag == 1)
    {
        users = fopen(url, "r");

    }
    if (flag == 2)
    {
        users = fopen(urlprodutos,"r");

    }

    if (flag == 4)
    {
        users = fopen(urladmin,"r");

    }

    if (flag == 5)
    {
        users = fopen(urladminsKeys,"r");

    }

    char *auxiliar = NULL;


    if (users == NULL)
    {
        printf("Erro na abertura do arquivo!");
        return 1;
    }
    else
    {
        char *lido;

        int i = 0;
        char *string;
        int tamVetor = 0;

        int a = 0;
        char *string2;
        int tamVetor2 = 0;

        char *pch;
        char *token;
        char comparador[15];

        int flag = 1;

        auxiliar = ""; // aqui o strcpy não funciona

        string = malloc(sizeof(char *) * tamVetor);

        string2 = malloc(sizeof(char *) * tamVetor2);

        while ((lido = fgetc(users)) != EOF)
        {
            if (lido == '#')
            {

                while ((lido = fgetc(users)) != EOF)
                {

                    printf("lido tem: %c\n", lido);
                    string[i] = lido;
                    strcat (auxiliar, string);
                    tamVetor++;
                    string = realloc(string, sizeof(char *) * tamVetor);

                }
            }
        }
        printf("String e : %s\n", auxiliar);
    }
    return auxiliar;
}



int main ()
{

    char *string = "Teste";
    char **result = NULL;

    string = LerDados(1);

    printf("String e %s: ", string);

    result = QuebrarStringCompleta(string);

    printf("as linhas separadas sao: ");

    for(int i = 0; i < 5; i++)
    {
        printf("%s\n", result[i]);

    }

    int i;

    for (i = 0; i < 5; i++)
        free(result[i]);

    free(result);

    string = NULL;

    result = NULL;

    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×