Dúvida sobre comparação de strings e filtragem em C [RESOLVIDO]

1. Dúvida sobre comparação de strings e filtragem em C [RESOLVIDO]

Tio do Toldo
Tio_do_Toldo

(usa Debian)

Enviado em 14/02/2020 - 11:32h

Não consegui resolver e nem achar solução na internet. É um exercício de um livro.

Crie uma função que delete cada caractere da string S1 que seja igual a qualquer caractere da string S2.


Eu já sei como filtrar e criar uma nova string sem tal caractere, mas como fazer isso com uma string inteira? Dá pra usar o coringa tipo:

if (S1[i] != S2[*]) 



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 15/02/2020 - 17:55h

Você não vai ter apenas um laço de repetição, mas sim dois, sendo um deles dentro do outro.

Quanto a usar funções, você pode. Só que qualquer função que seja útil vai ter de ter um laço de repetição dentro de si.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)

3. Re: Dúvida sobre comparação de strings e filtragem em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/02/2020 - 18:09h

Tio_do_Toldo escreveu:

Não consegui resolver e nem achar solução na internet. É um exercício de um livro.

Crie uma função que delete cada caractere da string S1 que seja igual a qualquer caractere da string S2.


“Cada caráter” (não é “caractere”) significa “todos os caracteres da string, um de cada vez, desde o primeiro até o último”. Isso implica o uso de um laço de repetição.

Semelhantemente, “qualquer caráter” significa “entre todos os caracteres que compõem a string, começando pelo início e caminhando em direção ao fim da string, o primeiro caráter que corresponder à condição que está sendo verificada”. Também isso implica um laço de repetição.

Eu já sei como filtrar e criar uma nova string sem tal caractere, mas como fazer isso com uma string inteira? Dá pra usar o coringa tipo:

if (S1[i] != S2[*]) 


Não. No C, você só manipular arrays na base de um elemento de cada vez. Você vai ter de usar laços de repetição, como dito acima.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


4. Re: Dúvida sobre comparação de strings e filtragem em C

Tio do Toldo
Tio_do_Toldo

(usa Debian)

Enviado em 15/02/2020 - 06:27h

paulo1205 escreveu:

Semelhantemente, “qualquer caráter” significa “entre todos os caracteres que compõem a string, começando pelo início e caminhando em direção ao fim da string, o primeiro caráter que corresponder à condição que está sendo verificada”. Também isso implica um laço de repetição.



Eu sei, Paulo. Mas no caso, cada caráter da S1 precisa passar por todos da S2 (ou até a condição ser satisfeita) e então retornar ao loop o próximo caráter da S1. Sendo no caso a string S2 quem estará "rodando" no loop, como setar um S1[i++] e jogar de volta no loop a string? Seria o caso de usar uma função dentro do loop que por sua vez faça um loop de cada caráter da S1?

Tipo:

for (i = 0; char funcao(S1[i] != '/0'); i++)  


Ou talvez um modo de mandar uma condicional no fim da string para um S1[i++].


5. Re: Dúvida sobre comparação de strings e filtragem em C [RESOLVIDO]

Mistery
Cmistry

(usa Ubuntu)

Enviado em 18/02/2020 - 20:41h


#include <stdio.h>

int main(void) {
char str1[15], str2[15], output[15];
int i, j, k, size_str1, size_str2;

printf("Digite uma palavra de ate 10 letras: ");
fgets(str1, 15, stdin);
printf("'%s'", str1);

printf("\nDigite outra palavra de ate 10 letras: ");
fgets(str2, 15, stdin);
printf("'%s'", str2);

size_str1 = strlen(str1);
size_str2 = strlen(str2);
for(i=0; i<size_str1; i++){
for(j=0; j<size_str2; j++){
if(str1[i] == str2[j]){
for(k=i; k<size_str1; k++) {
str1[k] = str1[k+1];
}
size_str1--;
i--;
}
}
}
printf("\nResultado: %s", str1);
return 0;
}



Veja funcionando no ideone...
https://ideone.com/G0Cnf7


6. Re: Dúvida sobre comparação de strings e filtragem em C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/02/2020 - 09:02h

Cmistry,

Acho que você fez alguma coisa errada, pois o seu algoritmo tem ordem cúbica (O(n³), ou O(n²×m), sendo n o tamanho de str1 e m o tamanho de str2), pois tem três níveis aninhados de laços de repetição, e ainda tem dois laços de repetição independentes a mais (cada uma das chamadas a strlen() é um laço de repetição que varre toda a string). Isso é muito pior do que poderia ser.

Veja um modo de fazer cuja complexidade é “apenas” quadrática (O(n²) ou, mais especificamente, O(n×m)).
/* Remove caracteres de uma string in-place (i.e. altera  a string original) */
void remove_chars(char *str, const char *denied_chars){
char *p_dest;
const char *p_orig;
for(p_orig=p_dest=str; *p_orig; ++p_orig){
for(const char *p_denied=denied_chars; *p_denied; ++p_denied)
if(*p_orig==*p_denied)
goto skip_char;
*p_dest++=*p_orig;
skip_char:
;
}
*p_dest='\0';
}



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


7. Re: Dúvida sobre comparação de strings e filtragem em C [RESOLVIDO]

Tio do Toldo
Tio_do_Toldo

(usa Debian)

Enviado em 22/02/2020 - 11:40h

O código dos senhores ficou bem mais sofisticado que o meu, mas ele funcionou também.

#include <stdio.h>
int
main ()
{

int b = 0, i = 0, a = 0;
int check;
#define TRUE 1
#define FALSE 0
char S1[10], S2[10], S3[10];

printf ("String a ser filtrada: \n");
scanf ("%9s", S1);

printf ("String blacklist: \n");
scanf ("%9s", S2);

for (b = 0; (S1[b] != '\0'); b++)
{

while (S2[i] != '\0')
{
if (S1[b] != S2[i])
{
check = TRUE;
}
else
{
check = FALSE;
break;
}
i++;
}

i = 0;

if (check == TRUE)
{
S3[a++] = S1[b];
}
}

S3[a] = '\0';

printf ("String resultante: %s \n", S3);

return 0;

}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts