elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Re: Cadenas en: 4 Noviembre 2020, 04:34 am
A mí me funciona bien el código. Puede ser porque estés introduciendo cadenas demasiado largas o valores inválidos que hacen que queden restos en el buffer. De todas formas te comento algunas mejoras y seguro que si las implementas funciona correctamente:

  • Utiliza constantes para los tamaños.
Código
  1. const int SIZE_CADENA = 500;
  2. const int SIZE_PALABRA = 50;
  3.  
  4. int main(){
  5.  char cadena[SIZE_CADENA];
  6.  char palabra[SIZE_PALABRA];
  7.  //...
  8. }

  • Utiliza nombres de variables más descriptivos.
Código:
x -> longitudCadena
w -> longitudPalabra
z -> indiceBusqueda

  • La función gets() no debe usarse. Es más seguro utilizar fgets():
Código
  1. printf("Introduce una cadena: ");
  2. fgets(cadena, SIZE_CADENA, stdin); // guarda como mucho SIZE_CADENA-1 caracteres porque reserva el ultimo para '\0'

  • La función fflush() está implementada para limpiar el buffer de salida (stdout), no el de entrada (stdin). Tampoco se recomienda usarlo. Además cuando se usa gets()/fgets(), también se guarda el Enter ('\n') al final de la cadena.
Con el siguiente código puedes limpiar el buffer de entrada y al mismo tiempo eliminar el salto de línea al final de la cadena. Dos pájaros de un tiro (esto debe ir justo después del fgets() anterior):
* Para usar strlen() hay que importar <string.h>. Esta función devuelve la longitud de la cadena sin contar el '\0' (strlen("hola\0") = 4)
Código
  1. if(cadena[strlen(cadena)-1] == '\n') cadena[strlen(cadena)-1] = '\0'; // Si el ultimo caracter es el Enter, lo eliminamos con '\0'
  2. else while(getchar() != '\n'); // sino, significa que la cadena no cabia entera y quedan restos en el buffer. Lo limpiamos.

Después de usar scanf() también quedará un '\n' en el buffer. Lo puedes limpiar de nuevo con el while():
Código
  1. scanf("%d", &repetir);
  2. while(getchar() != '\n'); // Limpia todo el buffer de entrada

Si sigue sin funcionarte comenta qué pruebas estás haciendo o porque sabes que no te está leyendo la segunda cadena.
Muchas gracias , ya funciona cambie gets por fgets y tambienalgunas otras cosas que sugeriste, muchas gracias
2  Programación / Programación C/C++ / Re: Cadenas en: 4 Noviembre 2020, 01:00 am
Modifica el post y añade lo que lleves echo o lo que intentaste. Así aprendes más que con un código de copiar y pegar.
hola gracias , si acabo de añadir mi código
3  Programación / Programación C/C++ / Cadenas en: 3 Noviembre 2020, 06:39 am
Hola , estoy realizando un programa en C que busque una palabra dentro de una cadena ,  lo que sucede es  que la segunda cadena no la esta leyendo , solo la primera que es ( cadena) ,me podrían ayudar porfavor
este es mi código
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    char cadena[500];
  6.    char palabra[50];
  7.    int x, w, z, val, op;
  8.  
  9.    printf("Ingrese la cadena: ");
  10.    gets(cadena);
  11.  
  12. do{
  13. fflush(stdin);
  14. x=0;
  15. w=0;
  16. val=0;
  17. printf("\nIngres la palabra a buscar: ");
  18.     gets(palabra);
  19.  
  20. while(cadena[x] != '\0'){
  21. x++;
  22. };
  23.  
  24. while(palabra[w] != '\0'){
  25. w++;
  26. };
  27.  
  28. for(int y=0; y<x; y++){
  29. z=0;
  30. while(palabra[z] != '\0'){
  31. if(palabra[z] == cadena[y+z]){
  32. val++;
  33. }
  34. z++;
  35. };
  36.  
  37. if(val==w){
  38. printf("\nPalabra encontrada en la posicion %d: ", y+1);
  39. y=x;
  40. } else{
  41. val=0;
  42. }
  43. }
  44.  
  45. if(val != w){
  46. printf("\nNo se encontro la palabra");
  47. }
  48.  
  49. printf("\n\nDesea buscar otra palabra(1=s/0=n): ");
  50.     scanf("%d", &op);
  51.  
  52. }while(op==1);
  53.  
  54.    return 0;
  55. }
  56.  
  57.  
  58.  
  59.  
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines