Help! Programa para sustituir un carácter en C

Iniciado por sora_ori, 6 Febrero 2013, 20:33 PM

0 Miembros y 1 Visitante están viendo este tema.

sora_ori

Buenas,

Estoy haciendo un programa en C que dada una frase te pregunta para sustituir un carácter y luego te pide el carácter para reemplazarlo.


El programa me falla después de introducir el caracter a buscar:




#include <stdio.h>
#include <conio.h>
#include <string.h>

void main(){


char cadena[100];
char cambiar;
char sustituir;
int i;

printf("Escribe una frase: "); //obtiene la cadena
gets(cadena);
printf("\nCaracter para cambiar: "); //obtener caracter a buscar para remplazar
scanf("%c",&cambiar);
printf("\nCaracter sustituto: "); //caracter sustituto
scanf("%c",&sustituir);

for (i=0;i<=strlen(cadena)-1;i++){ //recorremos la cadena
   if (cadena[i]==cambiar){ //compara
      cadena[i]==sustituir; //cambia el valor si lo encuentra
      } //end if
      } //end for
     
   printf("\n");
   printf("%s",cadena); //muestra en pantalla la nueva cadena
   printf("\n");
   
 system("pause");
 return 0;
}

amchacon

Tienes que limpiar el buffer de entrada o bien usar sscanf junto a fgets:

char linea[10];
fgets(linea, sizeof(linea), stdin);
sscanf(linea, "%d",&cambiar);
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

xassiz~

Aparte de lo del buffer, se te coló un igual de más aquí:
      cadena[i]==sustituir;

sora_ori

Gracias, se me había colado un "=" de más.


Aunque lo del buffer no lo entiendo, lo he puesto así:


printf("Escribe una frase: "); //obtiene la cadena
fgets(cadena, sizeof(cadena), stdin);
sscanf(cadena, "%d",&cambiar);
printf("\nCaracter para cambiar: "); //obtener caracter a buscar para remplazar
scanf("%c",&cambiar);
printf("\nCaracter sustituto: "); //caracter sustituto
scanf("%c",&sustituir);

xassiz~

Pero tú no quieres un double (%d). El tema del buffer te lo explica muy bien Littlehorse en este tema.

Saludos!

sora_ori

Si lo hago de esa forma no me pide por pantalla el caracter para sustituir.


printf("Escribe una frase: "); //obtiene la cadena
fgets(cadena, sizeof(cadena), stdin);
printf("\nCaracter para cambiar: "); //obtener caracter a buscar para remplazar
sscanf(cadena, "%d",&cambiar);
printf("\nCaracter sustituto: "); //caracter sustituto
scanf("%c",&sustituir);



leosansan

Cita de: sora_ori en  6 Febrero 2013, 21:33 PM
Si lo hago de esa forma no me pide por pantalla el caracter para sustituir.
Pues de esta otra sí:
Código (cpp) [Seleccionar]
#include <stdio.h>

int main(){
char cadena[100];
char cambiar;
char sustituir;
int i;
printf("Escribe una frase: "); //obtiene la cadena
gets(cadena);
printf("\nCaracter para cambiar: "); //obtener caracter a buscar para remplazar
scanf("%c",&cambiar);
while (getchar ()!='\n');
printf("\nCaracter sustituto: "); //caracter sustituto
scanf("%c",&sustituir);
for (i=0;cadena[i]!='\0';i++){ //recorremos la cadena
    if (cadena[i]==cambiar){ //compara
        cadena[i]=sustituir; //cambia el valor si lo encuentra
    }
    //end if
} //end for
    printf("\n");
    printf("%s",cadena); //muestra en pantalla la nueva cadena
    printf("\n");
  system("pause");
  return 0;
}

Saluditos!.

xassiz~

Cita de: sora_ori en  6 Febrero 2013, 21:33 PM
Si lo hago de esa forma no me pide por pantalla el caracter para sustituir.

#include <stdio.h>
#include <string.h>

int main(){
int i;
char buffer[100], cadena[100], cambiar, sustituir;

printf("Escribe una frase: "); //obtiene la cadena
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer, "%s", &cadena);

printf("\nCaracter para cambiar: "); //obtener caracter a buscar para remplazar
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer, "%c", &cambiar);

printf("\nCaracter sustituto: "); //caracter sustituto
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer, "%c", &sustituir);

for (i=0;i<=strlen(cadena)-1;i++){ //recorremos la cadena
if (cadena[i]==cambiar)
cadena[i]=sustituir;
}

printf("\n%s\n",cadena); //muestra en pantalla la nueva cadena

return 0;
}


Saludos!

sora_ori

Muchas gracias por la ayuda!!

Perfecto y comprendido


Un saludo

rir3760

La forma mas sencilla para solucionar el problema es utilizando la función scanf con el especificador de formato " %c", de esta forma:
puts("Escribe una frase:");
gets(cadena);

puts("Caracter para cambiar:");
scanf(" %c", &cambiar);

puts("Caracter sustituto:");
scanf(" %c", &sustituir);

Con ello primero se descarta el espacio blanco (en este caso el '\n' de la linea anterior) y solo entonces se lee el carácter.

Y por supuesto se debe eliminar el uso de gets.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language