Solución a la Tarea 7: Sopa de letras

Hay varias formas de resolver este problema. Una de ellas es la siguiente: Primero averiguamos si P aparece dentro de S, luego invertimos P y al final averiguamos si la P al reves aparece dentro de S. Esto lo logramos hacer con dos funciones, como se muestra abajo:

#include <stdio.h>
 
int aparece(char s[], char t[])
{
  int i, j, k;
 
  for (i = 0; t[i]; i++) {
    for (j = 0, k = i; t[k] && (t[k] == s[j]); j++, k++);
    if (!s[j]) return 1;
  }
  return 0;
}
 
void alreves(char s[])
{
  int c, i, j;
 
  for (j = 0; s[j]; j++);
  for (i = 0, j--; i < j; i++, j--) {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
  }
}
 
int main(void)
{
  char p[101], s[101];
  int d, r;
 
  gets(p);
  gets(s);
  d = aparece(p, s);
  alreves(p);
  r = aparece(p, s);
  printf("%d %d\n", d, r);
  return 0;
}

Los valores de entrada y salida empleados para la evaluación fueron los siguientes:

Entrada (cadenas separadas por espacios)     Salida
AVE           AAVEEEVAVEVAEVEVAVEVVVEAVE     1 1
ERA                                TAREA     0 1
CASA                                  NO     0 0
IGUALES                          IGUALES     1 0
ALREVES                          SEVERLA     0 1
ALPRI                        ALPRINCIPIO     1 0
FINAL                      ESTAVAALFINAL     1 0
ENMEDIO           PONEMOSENMEDIOLACADENA     1 0
ANITALAVALATINA          ANITALAVALATINA     1 1
LA   LAPONEMOSALPRINCIPIOENMEDIOYALFINAL     1 1

Para probar su tarea en UNIX, escriban la instrucción gcc letrasNN.c -o letras para compilar su programa, y la instrucción ./letras para correrlo. Algunos errores comúnes fueron: (a) No verificar correctamente si la cadena P aparecía al principio, enmedio o al final de S. (b) No verificar si la cadena P alrevés aparecía al principio, enmedio o al final de S. (c) Invertir P incorrectamente. (d) Al revisar al derecho, no fijarse en los caracteres nulos. (e) Al revisar alrevés, no fijarse en que las cadenas terminan con el caracter en la posición 0 de cada vector.