Jump to content
Fórum Script Brasil
  • 0

remoção de str dentro de str


hpfn
 Share

Question

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 to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.1k
×
×
  • Create New...