Read file and sort words alphabetically (with removal of special characters)

Asked

Viewed 796 times

0

I’ve been trying to find the mistake for a while, but I’m not getting it.

The program consists of reading a . txt file with the contents below, for example:

home-orange, otolaryngologist flower blackberry notebook table

Then the program must remove the special characters and words that have more than 20 letters. And then sort them in alphabetical order, giving the following output:

blackberry house flower orange notebook table

I’ve done a lot of things and I can’t get that out, so I was wondering if someone could help me and let me know where I’m going wrong. Follow the code below and thank you. :)

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


int main(int argc, char *argv[]) {

  FILE *arq;
  char ch[50];
  char simbolos[] = {' ', ',', '-','\n'};
  char *palavra = NULL;
  char **matriz;
  int resul, tamanho, i, j, k, matlen;

  //abrindo o arquivo
  arq = fopen("texto.txt", "r");
  //linha
  matriz=(char**)malloc(sizeof(char*)*1024);

  while( (fgets(ch, 1024, arq))!=NULL ){
    palavra = strtok(ch, simbolos);
    tamanho = strlen(palavra);
    if(tamanho > 20){
      //printf("String nao salva\n");
      *palavra = NULL;
    }
    else{
      //coluna
      matriz[i]=(char*)malloc(sizeof(char)*21);
      //copia a string que está no ponteiro teste pra posição I da matriz e imprime na tela, incrementa o i para correr a matriz
      //matlen - conta o tamanho da matriz - insere um elemento, aumenta mais 1 no contador
      strcpy(matriz[i], palavra);
      printf("%s", matriz[i]);
      i++;
      matlen++;
    }
  }

//matlen = variável para armazenar o tamanho da matriz
//comparo as posicoes j começa sempre 1 posição na frente o i
//-1 quer dizer que a primeira palavra [i] fica na fretne da de [j], então nada acontece
for(i=0;i<matlen; i++){
  for(j=i+1;j<matlen; j++){
      resul = strcmp(matriz[i], matriz[j]);
      if(resul == -1){
}
      //teoricamente o único resultado aqui vai ser 1, porque o 0 que é igual vai ser eliminado pela regra que vou fazer la em cima
      else{
        strcpy(palavra, matriz[i]); // teste é um ponteiro auxiliar pra eu armazenar a string e trocar de posição
        strcpy(matriz[i], matriz[j]); //copio a matriz
        strcpy(matriz[j], palavra);
      }
  }
}

//imprimindo a matriz só pra ver se organizou corretamente
printf("\n\n\n%s", matriz[0]);
printf("\n%s", matriz[1]);
printf("\n%s", matriz[2]);
printf("\n%s", matriz[3]);
printf("\n%s", matriz[4]);

fclose(arq);
return 0;
}

1 answer

0


See that ch is declared with size 50, but in fgets you admit up to size 1024 to put in ch.

Another strange part is:

tamanho = strlen(palavra);
if(tamanho > 20){
  //printf("String nao salva\n");
  *palavra = NULL;
}

This way you can only ask the first word of the 1024 characters obtained in fgets. Try to make another internal loop and a char matrix variable, like char palavras[1024][], to store all words; how: palavras[i] = palavra.

See the example of the following address: http://www.cplusplus.com/reference/cstring/strtok/? kw=Strtok

Browser other questions tagged

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