Delete repeated words in a string

1

Given a string, I need to check which words are not repeated (or those that come up only once) and pass those same words to a new string in order to save that information.

I tried to implement a function that did this but it did not work, and I still can not figure out what I'm doing wrong.

int i,size=0,j;
char str[]="Eu sou o Pedro. Sou alegre e sou divertido. Tenho um carro e tenho uma casa";
///String esperada = "Eu sou o Pedro alegre e divertido tenho um carro uma casa"
size = strlen(str);
char str_aux[100];
printf("Iniciar\n");
for (i=0; i<size; i++)
{
    for (j=i+1; i<size; i++ )
    {
        while (str[i]!= ' ')
        {
            if (str[i] != str[j])
            {
                str_aux[i] = str[i];
            }
        }
    }
}
printf("%c",str_aux);
    
asked by anonymous 08.11.2017 / 14:54

1 answer

4

Your code is very simple for the function of it, you are wrong because it is comparing characters and not strings, a char does not mean a string, but even if it meant the code would still lack something, you are comparing only with the character above, you would need to compare it with all other words.

The logic I followed for this algorithm was: I declare a struct with a char vector inside, and shortly thereafter declare a vetor of that struct (basically vetor size of the number of words in the sentence), in each "string" I must put a word of the sentence, but before I check if there is any equal, if there is not I add, finally I only print the entire vector that will have the whole sentence with no words repeated. The code below (You need to have some knowledge about functions, vectors, and pointers):

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

typedef struct{ //essa struct servirá para cada palavra
    char letras[15];
}String;

int qtd_palavra(char *frase){
    int i, qtd_char, qtd_palavra = 1; //inicializo com 1 pois antes do primeiro espaço já há uma palavra

    qtd_char=strlen(frase);
    for(i=0; i<qtd_char; i++){
        if((frase[i] != '
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{ //essa struct servirá para cada palavra
    char letras[15];
}String;

int qtd_palavra(char *frase){
    int i, qtd_char, qtd_palavra = 1; //inicializo com 1 pois antes do primeiro espaço já há uma palavra

    qtd_char=strlen(frase);
    for(i=0; i<qtd_char; i++){
        if((frase[i] != '%pre%') && (frase[i]==' '))
            qtd_palavra++;
    }

    return qtd_palavra;
}
void main(){
    int i=0, j=0, palavras_ok=0, qtd_char; 
    int str_igual=0; //booleano para definir se a palavra é diferente de todos, 1 para verdadeiro e 0 para falso
    String palavra; //usada como "cache" para verificar se há alguma palavra igual
    char str[]="Eu sou o Pedro. Sou alegre e sou divertido. Tenho um carro e tenho uma casa";
    String palavras[qtd_palavra(str)];//defino um vetor de "strings" do tamanho da quantidade de palavras na frase

    qtd_char=strlen(str);

    for(i=0; i<=qtd_char; i++){
        if(str[i]==' '||str[i]=='%pre%'){ //se for o fim da palavra, no caso, se for espaço, ou fim da frase
            str_igual=0; //deixo a variavel igual a falso sempre no começo do loop
            palavra.letras[j++]=' '; //da um espaço no final da palavra
            palavra.letras[j]='%pre%'; //finaliza a palavra

            j=0;
            while(j<palavras_ok){
                if (strcasecmp(palavra.letras,palavras[j].letras)==0){ //se a palavra pegada for igual alguma já preenchida
                    str_igual=1; //defino como verdadeiro, caso tenha alguma palavra igual
                    break; //finaliza o ciclo pois já há uma palavra igual
                }
                j++;
            }
            if(str_igual==0){ //se não tiver nenhuma palavra igual
                strcpy(palavras[palavras_ok++].letras,palavra.letras); //copia a palavra para uma nova palavra e adiciona mais um ao numero de palavras
            }
            strcpy(palavra.letras,""); //defino a palavra que sempre uso como vazia novamente
            j=0;
        }else{
            palavra.letras[j++]=str[i];
        }
    }

    j=0;
    while(j<palavras_ok){
        printf("%s",palavras[j++].letras);
    }

    fflush(stdin);
    getchar();
}
') && (frase[i]==' ')) qtd_palavra++; } return qtd_palavra; } void main(){ int i=0, j=0, palavras_ok=0, qtd_char; int str_igual=0; //booleano para definir se a palavra é diferente de todos, 1 para verdadeiro e 0 para falso String palavra; //usada como "cache" para verificar se há alguma palavra igual char str[]="Eu sou o Pedro. Sou alegre e sou divertido. Tenho um carro e tenho uma casa"; String palavras[qtd_palavra(str)];//defino um vetor de "strings" do tamanho da quantidade de palavras na frase qtd_char=strlen(str); for(i=0; i<=qtd_char; i++){ if(str[i]==' '||str[i]=='%pre%'){ //se for o fim da palavra, no caso, se for espaço, ou fim da frase str_igual=0; //deixo a variavel igual a falso sempre no começo do loop palavra.letras[j++]=' '; //da um espaço no final da palavra palavra.letras[j]='%pre%'; //finaliza a palavra j=0; while(j<palavras_ok){ if (strcasecmp(palavra.letras,palavras[j].letras)==0){ //se a palavra pegada for igual alguma já preenchida str_igual=1; //defino como verdadeiro, caso tenha alguma palavra igual break; //finaliza o ciclo pois já há uma palavra igual } j++; } if(str_igual==0){ //se não tiver nenhuma palavra igual strcpy(palavras[palavras_ok++].letras,palavra.letras); //copia a palavra para uma nova palavra e adiciona mais um ao numero de palavras } strcpy(palavra.letras,""); //defino a palavra que sempre uso como vazia novamente j=0; }else{ palavra.letras[j++]=str[i]; } } j=0; while(j<palavras_ok){ printf("%s",palavras[j++].letras); } fflush(stdin); getchar(); }

But for the code "I" is different from "I", since the strcmp is "case sensitive", I think it should have another function to compare with uppercase and lowercase, if I think I add it here. >

I changed from strcmp() to strcasecmp() which is the case-insensitve function of strcmp() .

    
08.11.2017 / 21:08