Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

arsenium123

alocar string dentro de struct

Recommended Posts

Tenho o seguinte problema, devo ler de um arquivo.txt algumas strings, e imprimir as que tem tamanho < 4

Formato do arquivo: tamanho string (ex.: 2 qwerty123)

 

Arquivo (apenas um exemplo curto):

 

2 hello word

5 strings

10 alocacao

3 calculadora

4 kdsdkn djksdjks

3 43 bla bla bla
1 2 ljdlskdlskdls
5 76 aaaaaaa
2 qwerty123

 

aí tenho que usar uma struct, da seguinte forma:

#define N 5 //numero de linhas

struct lista 
{
    char *string;
    int tamanho;
}vet[N];

typedef struct lista Lista;

Preciso alocar aquele char *string. Tentei de varias formas, criando um Lista *palavra para alocar o char *string, um próprio char *palavra, mas com certeza estou fazendo algo errado, porque não imprime, e dá erro no programa (estava usando um while (!feof(arquivo)), e dentro dele um for (i=0; i<N; i++), e lia as coisas com fscanf, (um %d e depois um %[^\n]s\n) e após isso alocava com o tamanho do vet.palavra, só para constar - não sei se estava no caminho certo).

Se eu faço só como um char "normal" (char string[tam]) ok, dá tudo certo

 

Ah! Só a cargo de curiosidade, como eu faria para pegar essas palavras desse arquivo e as ordenar alfabeticamente? O método de ordenação eu sei, mas como faria pegando-as do arquivo? Posso usar um fscanf normalmente?

 

Obrigada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você deve estar tendo erro pq provavelmente não está alocando memória pra sua string. Se eu entendi bem, você quer pegar todas as strings e imprimir somente as que tem tamanho menor que 4. Se for isso, tente assim:

for (j = 0; j < N; j++){
   fscanf(arquivo, "%d ", &i);
   vet[j].tamanho = i;
   vet[j].string = (char*)malloc(vet[j].tamanho);
   fgets(vet[j].string, vet[j].tamanho + 2, arquivo);
   if (vet[j].tamanho < 4)
     printf("%s\n", vet[j].string);
}

Caso você não queira se preocupar com a quantidade de linhas do arquivo, você poderia alterar seu struct para :

struct lista
{
  char *string;
  int tamanho;
} **vet;


E depois ler o arquivo da seguinte forma:

    vet = (struct lista**) malloc(sizeof(struct lista));    
    for (j = 0; !feof(arquivo) ; j++){  
       fscanf(arquivo, "%d ", &i);
        *(vet + j)= (struct lista*) malloc(sizeof(struct lista)); 
       (*(vet+ j))->tamanho = i;
       (*(vet+ j))->string = (char*)malloc((*(vet+ j))->tamanho);
       fgets((*(vet+ j))->string, (*(vet+ j))->tamanho + 2, arquivo);
       if ((*(vet+ j))->tamanho < 4)
         printf("%s\n", (*(vet+ j))->string);
    }

Depois é só não esquecer de destruir tudo isso aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.