Read archive and order words in alphabetical order (with removal of special characters)

0

I'm trying to find the error, but I'm not getting it.

The program consists of reading a .txt file with the following content, for example:

  

Home-orange, otolaryngologist flower   notebook-blackberry table

Then the program should remove 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 table notebook

I've done a lot of things and can not get this output, I'd like to know if anyone could help 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;
}
    
asked by anonymous 04.04.2018 / 08:28

1 answer

0

See that ch is declared as size 50, but in fgets , you allow up to size 1024 to set to ch .

Another strange part is:

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

This way you can only perish the first word of the 1024 characters in fgets . Try to make another internal loop and a char array variable, type char palavras[1024][] , to store all words; such as: palavras[i] = palavra .

See the example below: link

    
05.04.2018 / 18:08