iatauro 0 Posted March 19 Report Share Posted March 19 Olá, preciso fazer um código em C que leia um string (informado pelo usuário) e que ache uma palavra dentro desse string( a palavra a ser procurada também será informada pelo usuário) e no final mostre quantas vezes essa palavra apareceu. Por enquanto meu código está assim, infelizmente não consegui completar, alguém poderia me ajudar? #include<stdio.h> #include<string.h> #include<stdlib.h> int main(){ system("color 47"); char texto[501], busca[26]; int i, l, k, j, soma, resultado; printf("Escreva a palavra a ser buscada: "); fflush(stdin); gets(busca); printf("\nEscreva uma frase contendo no maximo 500 caracteres: "); fflush(stdin); gets(texto); soma = 0; l = strlen(texto); k = strlen(busca); resultado = strcmp(busca, texto); for(i=0; i<l; i++){ for(j=0;j<k;j++){ if(resultado==0){ soma++; } } } printf("%d", soma); return 0; } Link to post Share on other sites
rbsrbs_dev 3 Posted March 19 Report Share Posted March 19 Olá iatauro, Deves ter cuidado com a indentação das linhas. Não sei se estás a par disso, mas a linha onde chamas o strcmp embora esteja indentada (erradamente) está fora do ciclo e só é executada uma vez. Outro problema é o facto de o strcmp fazer uma comparação completa das strings, o que neste caso não é o que pretendes, porque só irias ter o resultado correto caso o `texto` não tivesse nenhuma ocorrência de `busca` ou se fossem exatamente as mesmas strings. A resolução mais próxima do que tens seria usar strncmp que faz a comparação de um número fixo de caracteres, que neste caso será o tamanho da string `busca`. Seria algo assim: for (i = 0; i < l; i++) { resultado = strncmp(&texto[i], busca, k); if (resultado == 0) soma++; } Uma outra alternativa usando funções standard é usares strstr que é basicamente o teu exercício, dentro de um ciclo. char * cur = texto; while (cur < texto + texto_len && (cur = strstr(cur, busca))) { cur++; soma++; } Fica como trabalho de casa a explicação Caso estejas interessado em algoritmos mais eficientes tens aqui uma listagem de alguns. Sugiro-te o Boyer–Moore. Outras observações: Convêm ganhares habito de dar melhores nomes às variáveis (e.g: l, k), porque só te dificulta a programares e quem lê o teu código agradece. Não deves usar a função gets. É extremamente insegura (buffer-overflows) e principalmente porque foi removida no standard C11. Deves usar a função gets_s adicionada em C11 ou então de preferência fgets. Neste caso terias algo do género: fgets(busca, 26, stdin); fgets(texto, 501, stdin; É recomendado criares macros para os tamanhos dos teus buffers para evitares repetires-te a escrever os mesmos números e possíveis erros que possam advir. E.g.: #define TEXTO_TAMANHO 501 #define BUSCA_TAMANHO 26 Isto fflush(stdin); é incorreto e deves parar de o fazer. Se o objetivo é limpares o buffer do stdin deves criar uma função para tal, por exemplo: void limpa_stdin(void) { int c; while ((c = getchar()) != '\n' && c != EOF) ; } O uso da função system é desaconselhado. Para pequenos programas teus não há grande problema, mas é só para teres em conta em não ganhares o habito de a usar. As principais razões são: o comando passado como argumento não será cross-platform (neste caso o comando color); função pesada a nível de performance. Link to post Share on other sites
iatauro 0 Posted March 20 Author Report Share Posted March 20 Em 19/03/2021 às 23:30, rbsrbs_dev disse: char * cur = texto; while (cur < texto + texto_len && (cur = strstr(cur, busca))) { cur++; soma++; } Olá, estou iniciando ainda em programação, poderia me explicar esse conceito? Não entendi como devo fazê-lo e nem como funciona, agradeço pela explicação anterior Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now