José Ol'Ivar Posted February 17, 2017 at 06:28 PM Report Share #602590 Posted February 17, 2017 at 06:28 PM (edited) E aí todos? Como vão? Sou novo tanto no fórum quanto no mundo da programação em C. Escrevi um programinha simples, que traz um recurso que permite ao usuário substituir uma sub-cadeia de um texto por outra cadeia de caracteres. Tudo corre bem no mais das vezes; porém quando, por exemplo, dou uma entrada como "Y YY", e quero substituir "YY" por, digamos, "OOO", o resultado é "OOO" e não "Y OOO" como seria esperado. Se alguém puder me ajudar, agradeço desde já! Segue abaixo o código: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> main() { char TextInic[1000], TextFin[1000], SubTextExcl[1000], SubTextIncl[1000]; char* pt; int i, j; while(1) { printf("\n\n Digite o texto ou 0 para sair: "); gets(TextInic); fflush(stdin); if(strcmp(TextInic, "0") == 0) break; printf("\n Digite o subtexto a ser excluido: "); gets(SubTextExcl); fflush(stdin); if(pt = strstr(TextInic, SubTextExcl)) { printf("\n Digite o subtexto a ser incluido: "); gets(SubTextIncl); fflush(stdin); i = 0; while(TextInic != *pt) { TextFin = TextInic; i++; } j = 0; while(SubTextIncl[j]) TextFin[i++] = SubTextIncl[j++]; for(j = strlen(TextInic) + strlen(SubTextExcl) - strlen(pt); TextInic[j] != '\0'; i++, j++) TextFin = TextInic[j]; TextFin = '\0'; printf("\n\n O texto ficou assim: %s", TextFin); } else printf("\n O subtexto a ser excluido nao esta contido no texto.\n"); } printf("\n\nFIM DO PROGRAMA"); } Edited February 18, 2017 at 11:08 PM by pwseo Bloco de código Link to comment Share on other sites More sharing options...
José Ol'Ivar Posted February 17, 2017 at 06:35 PM Author Report Share #602591 Posted February 17, 2017 at 06:35 PM (edited) Código exato: #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> main() { char TextInic[1000], TextFin[1000], SubTextExcl[1000], SubTextIncl[1000]; char* pt; int i, j; while(1) { printf("\n\n Digite o texto ou 0 para sair: "); gets(TextInic); fflush(stdin); if(strcmp(TextInic, "0") == 0) break; printf("\n Digite o subtexto a ser excluido: "); gets(SubTextExcl); fflush(stdin); if(pt = strstr(TextInic, SubTextExcl)) { printf("\n Digite o subtexto a ser incluido: "); gets(SubTextIncl); fflush(stdin); i = 0; while(TextInic != *pt) { TextFin = TextInic; i++; } j = 0; while(SubTextIncl[j]) TextFin[i++] = SubTextIncl[j++]; for(j = strlen(TextInic) + strlen(SubTextExcl) - strlen(pt); TextInic[j] != '\0'; i++, j++) TextFin = TextInic[j]; TextFin = '\0'; printf("\n\n O texto ficou assim: %s", TextFin); } else printf("\n O subtexto a ser excluido nao esta contido no texto.\n"); } printf("\n\nFIM DO PROGRAMA"); } Edited February 18, 2017 at 11:09 PM by pwseo Bloco de código Link to comment Share on other sites More sharing options...
José Ol'Ivar Posted February 18, 2017 at 10:11 PM Author Report Share #602612 Posted February 18, 2017 at 10:11 PM (edited) Hei pessoal, agradecido pela atenção, já descobri o bug. Mero erro nesta linha aqui: "while(TextInic != *pt)". Desculpem a precipitação. Segue o código, agora corrigido: #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> main() { char TextInic[1000], TextFin[1000], SubTextExcl[1000], SubTextIncl[1000]; char* pt; int i, j; while(1) { printf("\n\n Digite o texto ou 0 para sair: "); gets(TextInic); fflush(stdin); if(strcmp(TextInic, "0") == 0) break; printf("\n Digite o subtexto a ser excluido: "); gets(SubTextExcl); fflush(stdin); if(pt = strstr(TextInic, SubTextExcl)) { printf("\n Digite o subtexto a ser incluido: "); gets(SubTextIncl); fflush(stdin); i = 0; while(&TextInic != pt) { TextFin = TextInic; i++; } j = 0; while(SubTextIncl[j]) TextFin[i++] = SubTextIncl[j++]; for(j = strlen(TextInic) + strlen(SubTextExcl) - strlen(pt); j <= strlen(TextInic); i++, j++) TextFin = TextInic[j]; printf("\n\n O texto ficou assim: %s", TextFin); } else printf("\n O subtexto a ser excluido nao esta contido no texto.\n"); } printf("\n\nFIM DO PROGRAMA"); } Edited February 18, 2017 at 11:09 PM by pwseo Bloco de código Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 19, 2017 at 01:42 PM Report Share #602615 Posted February 19, 2017 at 01:42 PM isso compila ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
José Ol'Ivar Posted February 20, 2017 at 06:07 PM Author Report Share #602644 Posted February 20, 2017 at 06:07 PM Sim, compilei com o Code::Blocks Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 20, 2017 at 06:48 PM Report Share #602645 Posted February 20, 2017 at 06:48 PM a sério ? existem coisas ai muito estranhas que deveriam fazer que não, sendo a mais clara : TextFin = TextInic[j]. atribuir um caracter a um array ? nota que ao ver esse tipo de problema nem verifiquei os problemas normais de cópia de strings para "dentro" de outras IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
José Ol'Ivar Posted February 20, 2017 at 07:18 PM Author Report Share #602646 Posted February 20, 2017 at 07:18 PM De fato, você tem razão. Não sei o que aconteceu, mas ao colar o código na postagem como que sumiu as variáveis incrementais e respectivos colchetes. Agora que percebi isso. Link to comment Share on other sites More sharing options...
José Ol'Ivar Posted February 20, 2017 at 07:27 PM Author Report Share #602647 Posted February 20, 2017 at 07:27 PM #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> main() { char TextInic[1000], TextFin[1000], SubTextExcl[1000], SubTextIncl[1000]; char* pt; int i, j; while(1) { printf("\n\n Digite o texto ou 0 para sair: "); gets(TextInic); fflush(stdin); if(strcmp(TextInic, "0") == 0) break; printf("\n Digite o subtexto a ser excluido: "); gets(SubTextExcl); fflush(stdin); if(pt = strstr(TextInic, SubTextExcl)) { printf("\n Digite o subtexto a ser incluido: "); gets(SubTextIncl); fflush(stdin); i = 0; while(&TextInic[i] != pt) { TextFin[i] = TextInic[i]; i++; } j = 0; while(SubTextIncl[j]) TextFin[i++] = SubTextIncl[j++]; for(j = strlen(TextInic) + strlen(SubTextExcl) - strlen(pt); j <= strlen(TextInic); i++, j++) TextFin[i] = TextInic[j]; printf("\n\n O texto ficou assim: %s", TextFin); } else printf("\n O subtexto a ser excluido nao esta contido no texto.\n"); } printf("\n\nFIM DO PROGRAMA"); } Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 21, 2017 at 09:50 AM Report Share #602651 Posted February 21, 2017 at 09:50 AM ja tentaste alterar a string : "123 AA 123 AA 123" e pesquisar a substring "AA" e alterar por "CCC" ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
José Ol'Ivar Posted February 22, 2017 at 04:45 PM Author Report Share #602707 Posted February 22, 2017 at 04:45 PM Você tem razão nesse questionamento, mas tal complicação já estava prevista quando fiz o programinha, ficando, por assim dizer, a cargo do usuário sanar eventuais dificuldades quejandas. Por ex., para alterar a segunda substring "AA" na string por você dada, o usuário deveria pesquisar por " 123 AA" e substituir isso por " 123 CCC". Claro que casos como substituir o terceiro '1' de "111" por '0', isto é, "111" para "110", a pesquisa acaba tendo de usar a string inicial inteira. Seja como for, segue um código que penso resolva isso a contento. Caso tenha alternativa melhor, por favor, aponte-a. Abraços. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> main() { char TextInic[1000], TextFin[1000], SubTextExcl[1000], SubTextIncl[1000]; char* pt; int i, j, ocor, count; while(1) { printf("\n\n Digite o texto ou 0 para sair: "); gets(TextInic); fflush(stdin); if(strcmp(TextInic, "0") == 0) break; printf("\n Digite o subtexto a ser excluido: "); gets(SubTextExcl); fflush(stdin); printf("\n Digite qual repeticao do subtexto a excluir (1, 2, ...): "); scanf("%d", &ocor); fflush(stdin); count = 1; pt = strstr(TextInic, SubTextExcl); while((++count <= ocor)&&(pt != NULL)) pt = strstr(pt + strlen(SubTextExcl), SubTextExcl); if(pt) { printf("\n Digite o subtexto a ser incluido: "); gets(SubTextIncl); fflush(stdin); i = 0; while(&TextInic[i] != pt) { TextFin[i] = TextInic[i]; i++; } j = 0; while(SubTextIncl[j]) TextFin[i++] = SubTextIncl[j++]; for(j = strlen(TextInic) + strlen(SubTextExcl) - strlen(pt); j <= strlen(TextInic); i++, j++) TextFin[i] = TextInic[j]; printf("\n\n O texto ficou assim: %s", TextFin); } else printf("\n O subtexto a ser excluido nao esta contido no texto.\n"); } printf("\n\nFIM DO PROGRAMA"); } Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 22, 2017 at 06:03 PM Report Share #602709 Posted February 22, 2017 at 06:03 PM #include <stdio.h> #include <string.h> #define BUFFER_SIZE 256 #define RemoveLineFeed(str, len) if ((str)[(len) - 1] == '\n') (str)[--(len)] = '\0' int main(void) { // variaveis char haystack[BUFFER_SIZE], needle[BUFFER_SIZE], substitute[BUFFER_SIZE], * check; size_t haystack_size, needle_size, substitute_size; // leitura das strings do { printf("Digite o texto original : "); fflush(stdout); } while (! fgets(haystack, BUFFER_SIZE, stdin) || ! haystack[0] || haystack[0] == '\n'); haystack_size = strlen(haystack); do { printf("Digite o texto a ser pesquisado/alterado : "); fflush(stdout); } while (! fgets(needle, BUFFER_SIZE, stdin) || ! needle[0] || needle[0] == '\n'); needle_size = strlen(needle); do { printf("Digite o texto ser substituido : "); fflush(stdout); } while (! fgets(substitute, BUFFER_SIZE, stdin) || ! substitute[0] || substitute[0] == '\n'); substitute_size = strlen(substitute); RemoveLineFeed(haystack, haystack_size); RemoveLineFeed(needle, needle_size); RemoveLineFeed(substitute, substitute_size); // magia em meia duzia de linhas while ((check = strstr(haystack, needle)) != NULL) { void * remainder = (void *) ((size_t) check + needle_size); size_t shift = substitute_size - needle_size; memmove(remainder + shift, remainder, (size_t) haystack + haystack_size + 1 - (size_t) remainder); memcpy(check, substitute, substitute_size); haystack_size += shift; } printf("O texto final : %s\n", haystack); return 0; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
José Ol'Ivar Posted February 24, 2017 at 05:39 PM Author Report Share #602736 Posted February 24, 2017 at 05:39 PM Obrigado pela ajuda, Hyppo, mas confesso que não entendi completamente seu código - como disse, estou apenas iniciando no aprendizado de programação (acabei de avançar ao capítulo de estruturas do livro do DAMAS), e muita coisa ali me passa batido. Todavia, qual a estrutura dele que controla o caso de haver repetição da substring a substituir? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 24, 2017 at 08:21 PM Report Share #602737 Posted February 24, 2017 at 08:21 PM a secção do código que diz fazer magia em meia duzia de linhas IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
José Ol'Ivar Posted February 24, 2017 at 08:56 PM Author Report Share #602738 Posted February 24, 2017 at 08:56 PM Ok, vou analisar. Obrigado mais uma vez. Link to comment Share on other sites More sharing options...
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