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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error programa encontrar una cadena dentro de otra
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error programa encontrar una cadena dentro de otra  (Leído 3,669 veces)
David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Error programa encontrar una cadena dentro de otra
« en: 9 Abril 2014, 00:16 am »

Tengo que hacer un programa que verifique si una cadena se encuentra dentro de otra ( sin usar la función strstr() ). Este es el código:

Código:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

short int fBuscar(char *ptrX, char *ptrY, short int longitud);   // prototipo función fBuscar

short int fBuscar(char *ptrX, char *ptrY, short int longitud)
{
short int contador1 = 0;
short int contador2 = 0;
char *ptrZ = ptrY;   // usamos ptrZ como una variable auxiliar que almacena la dirección en memoria de cadenaABuscar[0]

for(; *ptrX != '\0'; ptrX++){

if(*ptrX == *ptrY){
contador1++;
contador2++;
ptrY++;   // ptrY apunta a la siguiente posición de memoria

if(contador1 == longitud){
return (contador2 - longitud);
}
}
else{
ptrY = ptrZ;
contador1 = 0;
contador2++;
}
}

return (-1);   // si se llega hasta aquí no se ha encontrado la cadenaABuscar en cademaOriginal
}

int main(void)
{
const short int tamanio;
int c;
printf("Definir tama%co aproximado de la cadena: ", 164);
scanf("%d", &tamanio);

while((c = getchar()) != '\n');   // limpieza del buffer

char cadenaOriginal[tamanio];   // cadena donde vamos a buscar
char cadenaABuscar[tamanio];   // cadena de caracteres que queremos ver si se encuentra en cadenaOriginal
short int longitud;
short int x;   // el valor de x verifica si la cadenaABuscar se encuentra en cadenaOriginal

puts("\nIntroducir cadena donde se quiere buscar:");
fgets(cadenaOriginal, tamanio, stdin);

puts("\nIntroducir cadena que queremos buscar:");
fgets(cadenaABuscar, tamanio, stdin);

longitud = strlen(cadenaABuscar) - 1;   // evitamos contar el caracter '\n' que almacena fgets()

x = fBuscar(cadenaOriginal, cadenaABuscar, longitud);

if(x == -1){
puts("Cadena no contenida");
}
else{
puts("Cadena no contenida");
printf("Encontrada en la posicion %d", x+1);
}

return EXIT_SUCCESS;
}


El problema es que al introducir por ejemplo hhola y después hola me da error porque de las h los punteros ptrX y ptrY saltan a la h y la o respectivamente.
No sé como arreglarlo. (SEGURAMENTE HAYA MÁS FALLOS)

Gracias


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Error programa encontrar una cadena dentro de otra
« Respuesta #1 en: 9 Abril 2014, 04:50 am »

Tengo que hacer un programa que verifique si una cadena se encuentra dentro de otra ( sin usar la función strstr() ).
La aproximación que tomas esta mal ya que si sucede una coincidencia parcial, por ejemplo si buscas "aab" en "aaab", los caracteres no se vuelven a verificar (en el ejemplo la búsqueda debe continuar a partir del segundo carácter).

Si la cadena es "s" y la subcadena a buscar es "t" la forma mas sencilla (fuerza bruta) es verificando cada posición de "s", por cada una revisas si los caracteres coinciden con la subcadena "t".

Un ejemplo de ello sencillo y sin funciones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char *s = "anita lava la tina";
  7.   char *t = "tina";
  8.  
  9.   int i;
  10.   int j;
  11.  
  12.   for (i = 0; s[i] != '\0'; i++){
  13.      for (j = 0; s[i + j] == t[j] && t[j] != '\0'; j++)
  14.         ;
  15.  
  16.      if (t[j] == '\0')
  17.         printf("Coincidencia en la posicion %d\n", i);
  18.   }
  19.  
  20.   return EXIT_SUCCESS;
  21. }

SEGURAMENTE HAYA MÁS FALLOS
Me temo que si. Algunos de ellos:

* La variable "tamanio" la declaras como solo lectura (calificador const) y después la utilizas para almacenar ahí un valor con scanf. Elimina ese calificador.

* Cuando se utiliza un bucle para descartar el resto de la linea debes verificar el caso de error o fin de archivo, ese bucle hay que cambiarlo a:
Código
  1. while ((c = getchar()) != EOF && c != '\n')
  2.   ;

* Cuando declaras un array e indicas el numero de elementos mediante un valor calculado en tiempo de ejecución (tu caso con los arrays "cadenaOriginal" y "cadenaABuscar") si es valido depende del compilador.

* No utilices "truquitos" como este:
Código
  1. printf("Definir tama%co aproximado de la cadena: ", 164);
Para imprimir caracteres fuera del juego de caracteres ASCII porque los entornos de edición y ejecución dependen de la implementación. En buen cristiano caracteres como la 'ñ' no están garantizados (evitalos salvo una buena razón).

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Error programa encontrar una cadena dentro de otra
« Respuesta #2 en: 9 Abril 2014, 12:11 pm »

Hice unos pequeños cambios en la función fBuscar y me funciona.
Pero no entiendo porque no puedo declarar a "tamanio" como const. El compilador no me da ningún warning y si me deja escribir en el ( la primera vez, lo he comprobado imprimiendo el  valor).

Gracias por los consejos, lo del fin de archivo creía que solo se ponía cuando se trabaja con ellos.

Un saludo  :D
En línea

noele1995

Desconectado Desconectado

Mensajes: 137



Ver Perfil
Re: Error programa encontrar una cadena dentro de otra
« Respuesta #3 en: 9 Abril 2014, 13:32 pm »

Bueno si la declaras como const es para que sea constante, si la vas a querer modificar entonces quitale el const ya que este sirve para indicar que no se va a modificar.

Saludos
En línea

David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Error programa encontrar una cadena dentro de otra
« Respuesta #4 en: 9 Abril 2014, 14:22 pm »

Eso quería decir. Es que según me lo puso rir3760 entendí que al momento de declararlo como const ya quedaba invariable aún sin tener ningún valor almacenado. Pero me resultaba raro ya que "obviamente" funciona.

Un saludo
En línea

noele1995

Desconectado Desconectado

Mensajes: 137



Ver Perfil
Re: Error programa encontrar una cadena dentro de otra
« Respuesta #5 en: 9 Abril 2014, 14:30 pm »

Bueno aunque te deje modificarlo no deberias, y creo puede desencadenar errores inesperados y/o diferentes resultados dependiendo del compilador y ordenador.

Saludos
En línea

David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Error programa encontrar una cadena dentro de otra
« Respuesta #6 en: 9 Abril 2014, 15:03 pm »

Muchas gracias a los dos  :D
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Error programa encontrar una cadena dentro de otra
« Respuesta #7 en: 9 Abril 2014, 15:19 pm »

Pero no entiendo porque no puedo declarar a "tamanio" como const. El compilador no me da ningún warning
Para que se generen los mensajes debes utilizar el modo mas estricto que tu compilador permita y ello debe indicarse claramente en su documentación.

Por ejemplo si este programa:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   const int a = 42;
  7.  
  8.   a = 69;
  9.   printf("%d\n", a);
  10.  
  11.   return EXIT_SUCCESS;
  12. }
Lo compilamos en la forma indicada utilizando Lcc-win32, Pelles C, CygMing (la version de gcc para Cygwin) y Visual C++ 2008 Express la salida es:
Código:
Lc.exe -A -ansic -check main.c

main.c:8:Error:assignment to const identifier 'a'
----
Pocc /Zs /W2 main.c

main.c(8): error #2032: Assignment to const identifier 'a'.
----
gcc (GCC) 4.7.3
gcc.exe -c -ansi -pedantic -Wall -O main.c -o main.tmp

main.c: In function ‘main’:
main.c:8:4: error: assignment of read-only variable ‘a’
----
CL.exe /TC /Zs /Za /Wall /W4 /D_CRT_SECURE_NO_WARNINGS main.c

main.c(8) : error C2166: Valor L especifica un objeto const

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Error programa encontrar una cadena dentro de otra
« Respuesta #8 en: 9 Abril 2014, 16:06 pm »

Efectivamente como dices si intento modificar la variable declarada con const con un valor previamente ya almacena me da error (lo que no sé es si tengo el compilador en modo estricto, supongo que no). Lo que pasa es que me parece que entendí mal lo que me dijiste. Interpreté que si ponías por ejemplo:

Código:
const cadena[tamanio];

Y luego le asignabas un valor debía de dar un error, (si la asignación ocurre solo una vez sin tener cadena ningún valor previo).
Por eso digo que es culpa mía de no haberlo interpretado bien.

Un saludo
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Encontrar una cadena de texto dentro de otra
PHP
deya 2 6,328 Último mensaje 27 Junio 2007, 23:52 pm
por deya
Buscar cadena de texto dentro de otra. PHP
PHP
OssoH 5 19,974 Último mensaje 27 Febrero 2011, 21:16 pm
por OssoH
¿Cómo encontrar una cadena dentro de un párrafo de texto?
.NET (C#, VB.NET, ASP)
Juancho25 5 3,951 Último mensaje 8 Junio 2013, 08:36 am
por Eleкtro
[Resuelto] buscar la cadena '<?' dentro de otra cadena con javascript
Desarrollo Web
srccver 4 3,431 Último mensaje 9 Abril 2015, 20:52 pm
por srccver
Concatenar una cadena dentro de otra cadena (PHP)
Desarrollo Web
Leguim 1 1,836 Último mensaje 5 Febrero 2019, 02:47 am
por Leguim
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines