Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sora_ori en 6 Febrero 2013, 20:33 pm



Título: Help! Programa para sustituir un carácter en C
Publicado por: sora_ori en 6 Febrero 2013, 20:33 pm
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)


Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4.  
  5. void main(){
  6.  
  7.  
  8. char cadena[100];
  9. char cambiar;
  10. char sustituir;
  11. int i;
  12.  
  13. printf("Escribe una frase: "); //obtiene la cadena
  14. gets(cadena);
  15. printf("\nCaracter para cambiar: "); //obtener caracter a buscar para remplazar
  16. scanf("%c",&cambiar);
  17. printf("\nCaracter sustituto: "); //caracter sustituto
  18. scanf("%c",&sustituir);
  19.  
  20. for (i=0;i<=strlen(cadena)-1;i++){ //recorremos la cadena
  21.    if (cadena[i]==cambiar){ //compara
  22.       cadena[i]==sustituir; //cambia el valor si lo encuentra
  23.       } //end if
  24.       } //end for
  25.  
  26.    printf("\n");
  27.    printf("%s",cadena); //muestra en pantalla la nueva cadena
  28.    printf("\n");
  29.  
  30.  system("pause");
  31.  return 0;
  32. }


Título: Re: Help! Programa para sustituir un carácter en C
Publicado por: amchacon en 6 Febrero 2013, 21:11 pm
Tienes que limpiar el buffer de entrada o bien usar sscanf junto a fgets:

Código
  1. char linea[10];
  2. fgets(linea, sizeof(linea), stdin);
  3. sscanf(linea, "%d",&cambiar);


Título: Re: Help! Programa para sustituir un carácter en C
Publicado por: xassiz~ en 6 Febrero 2013, 21:12 pm
Aparte de lo del buffer, se te coló un igual de más aquí:
Código
  1.       cadena[i]==sustituir;


Título: Re: Help! Programa para sustituir un carácter en C
Publicado por: sora_ori en 6 Febrero 2013, 21:19 pm
Gracias, se me había colado un "=" de más.


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


Código
  1. printf("Escribe una frase: "); //obtiene la cadena
  2. fgets(cadena, sizeof(cadena), stdin);
  3. sscanf(cadena, "%d",&cambiar);
  4. printf("\nCaracter para cambiar: "); //obtener caracter a buscar para remplazar
  5. scanf("%c",&cambiar);
  6. printf("\nCaracter sustituto: "); //caracter sustituto
  7. scanf("%c",&sustituir);


Título: Re: Help! Programa para sustituir un carácter en C
Publicado por: xassiz~ en 6 Febrero 2013, 21:28 pm
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!


Título: Re: Help! Programa para sustituir un carácter en C
Publicado por: sora_ori en 6 Febrero 2013, 21:33 pm
Si lo hago de esa forma no me pide por pantalla el caracter para sustituir.


Código
  1. printf("Escribe una frase: "); //obtiene la cadena
  2. fgets(cadena, sizeof(cadena), stdin);
  3. printf("\nCaracter para cambiar: "); //obtener caracter a buscar para remplazar
  4. sscanf(cadena, "%d",&cambiar);
  5. printf("\nCaracter sustituto: "); //caracter sustituto
  6. scanf("%c",&sustituir);



Título: Re: Help! Programa para sustituir un carácter en C
Publicado por: leosansan en 6 Febrero 2013, 23:02 pm
Si lo hago de esa forma no me pide por pantalla el caracter para sustituir.
Pues de esta otra sí:
Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4. char cadena[100];
  5. char cambiar;
  6. char sustituir;
  7. int i;
  8. printf("Escribe una frase: "); //obtiene la cadena
  9. gets(cadena);
  10. printf("\nCaracter para cambiar: "); //obtener caracter a buscar para remplazar
  11. scanf("%c",&cambiar);
  12. while (getchar ()!='\n');
  13. printf("\nCaracter sustituto: "); //caracter sustituto
  14. scanf("%c",&sustituir);
  15. for (i=0;cadena[i]!='\0';i++){ //recorremos la cadena
  16.    if (cadena[i]==cambiar){ //compara
  17.        cadena[i]=sustituir; //cambia el valor si lo encuentra
  18.    }
  19.    //end if
  20. } //end for
  21.    printf("\n");
  22.    printf("%s",cadena); //muestra en pantalla la nueva cadena
  23.    printf("\n");
  24.  system("pause");
  25.  return 0;
  26. }
  27.  
Saluditos!.


Título: Re: Help! Programa para sustituir un carácter en C
Publicado por: xassiz~ en 6 Febrero 2013, 23:18 pm
Si lo hago de esa forma no me pide por pantalla el caracter para sustituir.

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(){
  5. int i;
  6. char buffer[100], cadena[100], cambiar, sustituir;
  7.  
  8. printf("Escribe una frase: "); //obtiene la cadena
  9. fgets(buffer,sizeof(buffer),stdin);
  10. sscanf(buffer, "%s", &cadena);
  11.  
  12. printf("\nCaracter para cambiar: "); //obtener caracter a buscar para remplazar
  13. fgets(buffer,sizeof(buffer),stdin);
  14. sscanf(buffer, "%c", &cambiar);
  15.  
  16. printf("\nCaracter sustituto: "); //caracter sustituto
  17. fgets(buffer,sizeof(buffer),stdin);
  18. sscanf(buffer, "%c", &sustituir);
  19.  
  20. for (i=0;i<=strlen(cadena)-1;i++){ //recorremos la cadena
  21. if (cadena[i]==cambiar)
  22. cadena[i]=sustituir;
  23. }
  24.  
  25. printf("\n%s\n",cadena); //muestra en pantalla la nueva cadena
  26.  
  27. return 0;
  28. }

Saludos!


Título: Re: Help! Programa para sustituir un carácter en C
Publicado por: sora_ori en 6 Febrero 2013, 23:20 pm
Muchas gracias por la ayuda!!

Perfecto y comprendido


Un saludo


Título: Re: Help! Programa para sustituir un carácter en C
Publicado por: rir3760 en 7 Febrero 2013, 16:50 pm
La forma mas sencilla para solucionar el problema es utilizando la función scanf con el especificador de formato " %c", de esta forma:
Código
  1. puts("Escribe una frase:");
  2. gets(cadena);
  3.  
  4. puts("Caracter para cambiar:");
  5. scanf(" %c", &cambiar);
  6.  
  7. puts("Caracter sustituto:");
  8. 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