Ir para conteúdo
Fórum Script Brasil
  • 0

remoção de str dentro de str


hpfn

Pergunta

Olá,

 

Resolvi um exercício do livro do Luís Damas (Linguagem C).

O problema é que não entendo a solução apresentada no livro.

O exercício:

char *StrDelStr(char *s1, char *s2)

apaga em s1 a primeira ocorrência de s2.

 

Exemplo:

char p[] = "O rato roeu a rolha da garrafa de rum do rei da Rússia"

StrDelStr(p, "rum");

puts(p) -> "O rato roeu a rolha da garrafa de do rei da Rússia"

 

A solução do livro:

char *StrDelStr(char *s1, char *s2)
{
	char *loc = strstr(s1,s2);
	
	if (loc != NULL)
		strcpy(loc,loc+strlen(s2));

	return s1;
}

 

O retorno de strstr é 'rum do rei da Rússia'.

strcpy copia para dest(loc) um espaço maior

que dest tem. O que entendo que é errado.

E o resultado é o esperado. sem o trecho 'rum'.

 

Alguém poderia explicar, passo a passo, o procedimento ?

 

Aqui minha solução. Sem o uso de string.h. Na

correria esqueci de extender o prazo do paste.debian.net.

Posto de novo se necessário.

http://paste.debian.net/405773

Download do arquivo:

http://paste.debian.net/download/405773

 

Abraço,

Herbert

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

quando você passou por

char *loc = strstr(s1,s2);

loc ficou apontando justo a posição onde começa rum, si não me engano na posição 33, se você fizer um printf de loc, você vai ver que vai imprimir justo "rum do rei da Rússia" ou seja, loc aponta a 33ª letra de char p[] = "O rato roeu a rolha da garrafa de rum do rei da Rússia" que é justo onde começa "rum", dai você ta confundindo não sei que na parte strcpy(loc,loc+strlen(s2));, mas concretamente na parte loc+strlen(s2). Se você tiver bem claro que é um string você saberá que um string é um conjunto de letras(chars) armazenado na memoria de forma consecutiva, todos e cada um desses chars tem um tamanho de 1 byte, e o tamanho total de p é a soma de todas as letras +1 que é o carácter nulo que marca o fim do string, dai que strstr retornou a 33ª letra onde se encontra a primeira letra da palavra "rum" então digamos que p[0] é o byte zero, e p[33] é o byte 33 justo onde esta a letra 'r', a seguinte letra é a 34 que é a letra 'u', e por ultimo a 35ª letra é 'm', somando 'r'+'u'+'m' = "rum", rum mede 3 bytes pois tem 3 letras, isso é o que retorna strlen(s2), que é a mesma coisa que strlen("rum"). Então loc+strlen(s2) é como dizer, some a loc que aponta a 33ª posição mais 3 bytes, então agora loc aponta logo depois de rum, e isso é o que se copia a posição 33.
To fazendo isso meio de cabeça, más o efeito que tem strcpy(loc,loc+strlen(s2)); é pegar na frase:
"O rato roeu a rolha da garrafa de rum do rei da Rússia0"
copiar loc que aponta a 33ª ou 34ª posição, ou seja:
"rum do rei da Rússia0"
avançar o ponteiro 3 posições ficando:
"do rei da Rússia0"
e copiar isso na 33ª posição "comendo" assim a palavra "rum", isso é o que ta acontecendo.

Isso tudo é tema de ponteiros, se não entendeu ponteiros não continue avançando, volte a estudar ponteiros até ficar bem afiado, si não tudo vai custar muito mais trabalho daqui em diante.
 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...