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:
(http://i49.tinypic.com/149o6xy.png)
#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;
}
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);
Aparte de lo del buffer, se te coló un igual de más aquí:
cadena[i]==sustituir;
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);
Pero tú no quieres un double (%d). El tema del buffer te lo explica muy bien Littlehorse en este tema (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).
Saludos!
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);
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í:#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!.
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!
Muchas gracias por la ayuda!!
Perfecto y comprendido
Un saludo
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