Ir ao conteúdo
  • Cadastre-se
Victorbg

(Duvida) Mudanças de ocorrência em string

Recommended Posts

Olá Amigos!

gostaria de tirar uma duvida aqui, estou fazendo esse exercício conforme o enunciado:

 

- Escreva uma função que receba um ponteiro para uma string e 2 caracteres. Troque todas as ocorrências do primeiro caractere © pelo segundo caractere informado (x). Retorne o número de trocas efetuadas.

A função deve ter o seguinte protótipo:

int replace(char *s, char c, char x)

 

Ex : arara -> trocar todas as ocorrências de ‘r’ por ‘x’

     resultado -> axaxa

 

OBS: Não use nenhuma função da biblioteca string nesse exercicio

 

Conforme o enunciado usei essa lógica:

 
#include<stdio.h>#include<stdlib.h>int replace(char *s, char c, char x){     char *p;     char aux;     int cont;     for(p=s;*p!='\0';p++)        if(*p==c)        aux=c;        *p=x;        //troca++;        return *p;           }  main(){    char str[20];    char d,y;    printf("Digite a string desejada:\n");    gets(str);    printf("Digite o caractere a ser trocado na string:\n");  scanf("%c",&d);    printf("Digite o novo caractere para substituir o primeiro:\n");  scanf("%c",&y);    printf("\n");    //replace(str,d,y);    printf("Nova string: %s\nPrimeiro Caractere: %c\nSegundo Caractere: %c\n",str,d,y);    system("PAUSE");    return 0;}  
No inicio tudo bem ele pede os valores string desejada e o caractere a ser trocado mas dai quando chega no próximo e terceiro print(novo caractere) ele já pula para a exibição dos três valores (ultimo printf), exibe a string digitada, o caractere digitado no segundo printf mas não dá para digitar o penultimo scanf e o programa não tá lendo todos os valores. Gostaria de saber que devo fazer e se a lógica usada na função para trocar as palavras estaria correta assim. Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de tudo queria pedir desculpas por ter fechado sem querer o outro tópico que criei, ainda estou me familiarizando com esse fórum já que é minha primeira vez aqui :)


 


Então, mudei aqui o código conforme as orientações do Main.cpp, atribui mais uma variável para retornar o valor da contagem de trocas e ficou assim:





#include<stdio.h>
#include<stdlib.h>


int replace(char *s, char c, char x)
{
     char *p;
     char aux;
     int cont,valor;
     for(p=s;*p!='\0';p++)
     {  
        if(*p==c){
        aux=c;
        *p=x;
        return *p;
        }
     cont++;
     return valor;  
     }  
}  


int main()
{
    char str[20];
    char d,y;
    printf("Digite a string desejada:\n");
    gets(str);
    fflush(stdin);
    printf("Digite o primeiro caractere:\n");  
    scanf("%s",d);
    fflush(stdin);
    printf("Digite o segundo caractere :\n"); 
    scanf("%s",y);
    fflush(stdin);
    printf("\n");
    replace(str,d,y);
    printf("Nova string: %s\nPrimeiro Caractere: %s\nSegundo Caractere: %s\n",str,d,y);
    system("PAUSE");
    return 0;
}    



 


 


exemplo de execução:


Digite a string desejada:


mississipi


Digite o primeiro caractere:


s


após o enter, não aparece a solicitação de dígito do segundo caractere e o programa dá uma mensagem critica de erro: "Exercicio2 parou de funcionar"... e na hora que vou escrever a função coloquei o *p como retorno para ele retornar o valor da string modificada na função, mas estou em dúvida como retorno a string modificada (se é assim mesmo) e a quantidade de trocas, tenho que fazer 2 return?! fiz aqui teste de mesa e simulação da memória para ter noção melhor na manipulação dos ponteiros também... queria saber que tem ai de errado no código, e a minha lógica do exercicio falta alguma coisa?


Compartilhar este post


Link para o post
Compartilhar em outros sites

Você deve limpar o buffer antes do usuário digitar a informação - fflush(stdin). Além disso, a variável valor não é inicializada portando ela retorna um "valor" indesejável, elá é dispensável. Inicialize cont com 0,  cada vez que se passar a situaçao desejada, deve incrementa-lo. Então fora do loop você deve retornar o cont, caso contrário a cada execução do loop ele irá retornar, como está no seu código. Pode não ter fica bem claro mas tente implementar seguindo essa maneira e poste caso surja mais dúvidas. Até mais e bom "divertimento".


Não havia prestado atenção no seu comentário, mas o seguinte: você só pode retornar um valor por execução da função, portanto não há como usar dois return.

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include<stdio.h>#include<stdlib.h>int replace(char *s, char c, char x){     char *p;     int troca=0;//,valor;     for(p=s;*p!='\0';p++) /*percorre o endereço de s=str[] até o valor nulo e sai do laço*/     {          if(*p==c){         /*caso o valor de *p=str[] seja igual ao valor de c*/        *p=x;              /*o valor do elemento correspondente da string recebe o valor da variável x*/        troca = troca + 1; /*incrementação da variável inteira troca*/                }     }       printf("\n Nova String: %s , Caracter a ser trocado: %c , Novo Caracter: %c ", *p,c,x);    /*Imprime a String modificada apontada por de *s */     return troca;  /*de acordo com a função, pois seu retorno é um int = trocas realizadas*/}main(){    char str[20], d, y;    char *pont;    int x=0;    printf("Digite a string desejada:\n");    gets(str);    fflush(stdin);    printf("Digite o primeiro caractere:\n");      scanf("%c",&d);    fflush(stdin);    printf("Digite o segundo caractere :\n");     scanf("%c",&y);    x=replace(str,d,y);    //replace(str,&d,&y);    //printf("Nova string: %s\nCaractere a ser trocado: %c, Novo Caracter: %c ",str,d,y);    printf("\nQuantidade de ocorrencias:%d",x);    system("PAUSE");    return 0;}    
 
Meu programa ficou assim agora, ele consegue contar todas as trocas que eu realizei até então e mostrar cada caractere que digitei, deixei uns comentários linhas simples que foram para eu comparar o meu erro anterior e a correção do código... o único problema tá na saída para imprimir o vetor que tá dando um bug:
Nova String: <null>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Baseado no código postado acima, A função replace(); está executando o seu papel correto.
ela tá retornando a palavra trocada para função Principal.
 comente a seguinte linha acima do:

return troca;

//printf("\n Nova String: %s , Caracter a ser trocado: %c , Novo Caracter: %c ", p,c,x);  

E acrescente no main(); a seguinte linha, que aliás você já tava tentando isto pelo que observei:

    printf("\n\nNova palavra %s ", str );printf("\n\n"); // Isto aqui é opcional    system("PAUSE>null");// Isto aqui é opcional

Só isto, por aqui funcionou perfeito

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×