Foros del Web » Programación para mayores de 30 ;) » C/C++ »

buscar una subcadena dentro de una cadena

Estas en el tema de buscar una subcadena dentro de una cadena en el foro de C/C++ en Foros del Web. Hola, la siguiente función cuenta los caracteres que hay en una subcadena: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original #include <stdio.h> #include <stdlib.h> #include <string.h>   ...
  #1 (permalink)  
Antiguo 07/07/2010, 10:48
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
buscar una subcadena dentro de una cadena

Hola, la siguiente función cuenta los caracteres que hay en una subcadena:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(){
  6.          char cad1[100];
  7.          char cad2[50];
  8.          int subcadena;
  9.  
  10.          printf("Introduce una cadena: ");
  11.          scanf("%99s", cad1);
  12.  
  13.          printf("Introduce la subcadena a buscar: ");
  14.          scanf("%49s", cad2);  
  15.  
  16.          subcadena = buscar_subcadena(cad1, cad2);
  17.  
  18.          printf("La subcadena tiene %d caracteres.\n", subcadena);
  19. }
  20. int buscar_subcadena(char cad1[], char cad2[]){
  21.          int i=0;
  22.          int j, k;
  23.          int encontrado = 0;
  24.  
  25.          while((cad1[i] != '\0') && (encontrado != 1)){
  26.                 j=0;
  27.                 k=i;
  28.  
  29.                 while((cad1[k]==cad2[j]) && (cad2[j] != '\0')){
  30.                      k++;
  31.                      j++;
  32.                 }
  33.                 if(cad2[j]=='\0'){
  34.                     encontrado = 1;
  35.                 }
  36.                 else{
  37.                     i++;
  38.                 }
  39.          }
  40.          if(encontrado == 0){
  41.                    i = -1;
  42.          }
  43.          return(i);
  44. }

Cuando lo compilo no me sale bien.
Introduce una cadena: papel
Introduce la subcadena a buscar: pap
La subcadena tiene 0 caracteres.
¿Por qué no cuenta los caracteres de la subcadena?
  #2 (permalink)  
Antiguo 07/07/2010, 15:03
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: buscar una subcadena dentro de una cadena

Tu problema, que no se si es un problema porque no se bien que queres devolver, pero fijate que devolves la i. Fijate cuando pones papel y pap como entrada la variable i en el trascurso del while, nunca se modifica, osea queda en 0. porlo que cuando la encontras pones encontrado igual a 1 ( no aumentas la i) llegas al while inicial, falla la condicion y sale del while. Entonces hace return i donde i es 0.

Ahora bien, no entiendo a que te referis con los caracteres de la subcadenas, vos queres que devuelva -1 si no esta, sino el largo de la cadena 2?? para eso tenes que devolver la variable k.
  #3 (permalink)  
Antiguo 08/07/2010, 06:25
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: buscar una subcadena dentro de una cadena

He cambiado la i por la k, pero por ejemplo si introduzco la cadena rodillo y la subcadena que quiero extraer es ro me cuenta bien los caracteres, si pongo rod también cuenta los caracteres de la subcadena bien. El problema viene cuando la subcadena que pongo es al azhar, es decir sin seguir el orden en que están dispuestas las letras que componen la cadena. Pongo como subcadena di (sigo con la palabra rodillo) y me dice que la subcadena tiene 4 caracteres.

Para que lo entiendas mejor te pongo un ejemplo:

Introduce una cadena: rodillo
Introduce la subcadena a buscar: ro
La subcadena tiene 2 caracteres.

Introduce una cadena: rodillo
Introduce la subcadena a buscar: rod
La subcadena tiene 3 caracteres.

Introduce una cadena: rodillo
Introduce la subcadena a buscar: rodi
La subcadena tiene 4 caracteres.

Introduce una cadena: rodillo
Introduce la subcadena a buscar: di
La subcadena tiene 4 caracteres.
  #4 (permalink)  
Antiguo 08/07/2010, 07:01
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: buscar una subcadena dentro de una cadena

Viendo bien el codigo, la k lleba la posicion en la primer cadena, prueba devolviendo la j que es la que lleva la posicion.
  #5 (permalink)  
Antiguo 08/07/2010, 10:19
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: buscar una subcadena dentro de una cadena

Ahora sí. Gracias.
  #6 (permalink)  
Antiguo 11/07/2010, 21:41
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: buscar una subcadena dentro de una cadena

Puedes tambien usar la funcion strstr le das de parametro la cadena, la subcadena y regresa un puntero char* a la posicion de la occurencia, si no hubo occurencia regresa NULL.

Un ejemplo:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(){
  5.  
  6.     char str[] = "Este es un ejemplo de una cadena";
  7.     char *pstr;
  8.     pstr = strstr(str, "es");
  9.     if(pstr == NULL)
  10.         printf("No occurencias\n");
  11.     else
  12.         printf("Ocurrencia en la posicion %d\n", (int) (pstr - str));
  13.     return 0;
  14. }
Probado con gcc en ubuntu 10.04

Etiquetas: subcadena, cadenas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:23.