Ir ao conteúdo

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


v1c2rr

Posts recomendados

Postado

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!
Postado

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?


Postado

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.

Postado
#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>

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!