hpfn Postado Fevereiro 26, 2016 Denunciar Share Postado Fevereiro 26, 2016 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 vangodp Postado Fevereiro 26, 2016 Denunciar Share Postado Fevereiro 26, 2016 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 hpfn Postado Fevereiro 26, 2016 Autor Denunciar Share Postado Fevereiro 26, 2016 Obrigado pelo detalhamento da resposta. O assunto não saia da cabeça. Percebi o incremento de loc enquanto assistia o jornal da Band. :) abraço, Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
hpfn
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
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.