• Viernes 8 de Noviembre de 2024, 19:09

Autor Tema:  Duda - Una cadena contenida en otra  (Leído 2136 veces)

Carlota

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Duda - Una cadena contenida en otra
« en: Domingo 5 de Septiembre de 2010, 22:02 »
0
Hola! Paso por aqui porque tengo problemas con un algortimo... Dejo el enunciado y os explico lo que me ocurre:
Comprobar si una cadena esta contenida en otra y, si fuera asi, indicar la posicion del primer caracter.
USAR: int buscar_cadena(char *cad1, char *cad2)


El codigo que he hecho:

Código: C++
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAM 100
  4.  
  5. char strsub(char *c1, char *c2);
  6. int buscar_cadena(char *c1, char *c2);
  7. void leer_cadena(char cad[]);
  8.  
  9. int main(){
  10.     char c1[TAM],c2[TAM];
  11.     int res;
  12.    
  13.     leer_cadena(c1);
  14.     leer_cadena(c2);
  15.    
  16.     res=strsub(c1, c2);
  17.     if(res==0) puts("Las cadenas son iguales (ambas incluidas una en otra)");
  18.     else if(res==1) puts("Primera cadena incluida en segunda");
  19.          else if(res==2) puts("Segunda cadena incluida en primera");
  20.               else if(res==3) puts("Las cadenas no estan incluidas ninguna en otra");
  21.              
  22.     system("PAUSE");
  23.     return 0;
  24. }
  25.  
  26. //Cabecera: char strsub(char *c1, char *c2);
  27. //Precondicion:Dos cadenas inicializadas
  28. //Postcondicion: Devuelve si una cadena esta contenida en otra y viceversa
  29.  
  30. char strsub(char *c1, char *c2){
  31.      int c2enc1, c1enc2;
  32.      c2enc1= buscar_cadena(c1,c2);
  33.      c1enc2= buscar_cadena(c2,c1);
  34.      
  35.      if(c2enc1==-1)
  36.                     if(c1enc2==-1){
  37.                                    return 3;
  38.                                    } /* no hay inclusiones */
  39.                     else return 1; /*c1 incluida en c2*/
  40.      if(c1enc2==-1){
  41.                     return 2;
  42.                     } /*c2 incluida en c1 */
  43.      
  44.      return 0; /* c1 y c2 son iguales */
  45.      }
  46.      
  47.      
  48. //Cabecera: int buscar_cadena(char *c1, char *c2);
  49. //Precondicion:Dos cadenas inicializadas
  50. //Postcondicion: Posicion de una en otra
  51.  
  52. int buscar_cadena(char c1[], char c2[]){
  53.     int pos=0;
  54.     int i;
  55.    
  56.     while(1){
  57.              for(i=0;c1[pos+i]!='' && c2[i]!='';i++)
  58.                                      if(c1[pos+i]!=c2[i]) break;
  59.  
  60.              if(c2[i]=='') return pos;
  61.              if(c1[pos+i]==''){
  62.                                  printf("El primer caracter se encontro en la posicion %in",pos+1);
  63.                                  return -1;
  64.                                  }
  65.              pos++;
  66.              }
  67.              }
  68.                      
  69.                      
  70. //Cabecera: leer_cadena(char cad[])
  71. //Precondicion: cad inicializada
  72. //Postcondicion: lee una cadena
  73.                
  74. void leer_cadena(char cad[]){
  75.    
  76.      int i;
  77.      puts("Introduce cadena y pulsa ENTER para terminar la cadena");
  78.      fgets(cad, 100, stdin);
  79.      fflush(stdin);
  80.      }                                    
  81.  
  82.  

Lo que me ocurre esque si por ejemplo introduzco:
Esta entrada es correcta
Y luego escribo:
es correcta

Me da la posicion y me indica que la segunda cadena esta contenida en la primera... bien hasta aqui, pero si en la segunda cadena escribo esto:

entrada

Me indica que ninguna cadena esta contenida una en otra y las posiciones salen erroneas...

Alguien podria decirme donde esta fallando y que podria hacer para arreglarlo?

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Duda - Una cadena contenida en otra
« Respuesta #1 en: Lunes 6 de Septiembre de 2010, 16:35 »
0
Usa la función strstr() de C, que te devuelve un puntero a la posición de la segunda cadena respecto a la primera. Luego restas los punteros y tienes la posición.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

Carlota

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Duda - Una cadena contenida en otra
« Respuesta #2 en: Miércoles 8 de Septiembre de 2010, 22:34 »
0
No puedo usar dicha funcion, ya que necesito saber hacerlo sin usar string.h
Ademas, el problema es que si continua leyendo y acaba la segunda cadena deberia decir que esta contenida en la primera y no es asi...