Cómo probar si una cadena es una subcadena de otra cadena en C sin ninguna función incorporada

Al hacer esto en C, las únicas incorporaciones que usaría normalmente serían strlen y strncmp (o sus equivalentes de caracteres anchos / UTF8).

Estos se codifican fácilmente a mano, y en el caso de strncmp , no lo usaría de todos modos si desea que su algoritmo funcione en cualquier nivel que no sea algo cercano a O (longitud (S1) * longitud (S2)).

Para obtener mejores resultados en términos de rendimiento, probará carácter por carácter, con pseudocódigo similar a

S1 es el candidato de subcadena
S2 es la cadena en la que estamos tratando de encontrar S1

L1 <- longitud de S1
L2 <- longitud de S2

si L1> L2, devuelve falso (S1 es más largo que S2, por lo que no puede ser una subcadena)

si L1 == 0, devuelve verdadero (la cadena vacía siempre es una subcadena)

si L2 == 0, devuelve falso (una cadena no vacía nunca es una subcadena de vacío)

actual (S2) <- primera pos de S2

mientras cierto
hacer
si no hay más caracteres en S2
falso retorno
más si actual (S2) == primero (S1)
actual (S1) <- primera posición de S1
hacer
avance S2
avance S1
si no hay más caracteres en S1, devuelve verdadero (subcadena encontrada)
si no hay más caracteres en S2, devuelve falso (no hay subcadenas posibles)
mientras actual (S1) == actual (S2)
más
avance (S2)
terminara si
hecho

Esto podría implementarse fácilmente en C, y sería más eficiente si no se usa strncmp , ya que sería O (longitud (S1) + longitud (S2)) si se implementa usando comparaciones carácter por carácter.

Es posible que pueda encontrar la respuesta en este diálogo Compruebe si una cadena contiene una cadena en C ++

Actualización: – La última parte de este hilo Encontrar subcadenas en una cadena sin usar la función de biblioteca podría ajustarse un poco mejor a la factura y parecerse más a lo que busca.

mira una computadora es un imbécil que hace cosas que le dices muy rápido …

asumiendo que tienes una cadena:

“Esto no es una cuerda, pero es una cuerda”

(tenga en cuenta que la falta de ortografía es intencional) y desea saber si se trata de una subcadena:

“una cuerda”

como lo harias… ?

encuentra dónde está el primer carácter de la segunda cadena en la primera y luego compara hasta que los caracteres no coinciden, o hasta la longitud de la segunda cadena … si se extiende mientras coincide, felicidades, ha encontrado una subcadena …

si no, entonces regrese y repita para hacerlo nuevamente hasta el final de la cadena …

muy fácil

pruebe el primer carácter de la cadena contra el primer carácter de la subcadena si coinciden, compare los segundos caracteres y repita. Si llega al final de la subcadena, entonces es una subcadena. si no comienza de nuevo con la segunda (siguiente) letra de la cadena, es decir, compare la segunda letra de la cadena con la primera letra de la subcadena. continúe hasta obtener una subcadena o toque el final de la cadena. (es decir, obtienes un 0 byte como personaje)

No se necesitan funciones de biblioteca.

Tendría que usar un bucle (¿cuál?) Y usar una condición en la que si el primer carácter coincide, continuar el bucle, etc.