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()
.