Introducción

En Java, el método indexOf() de los objetos String, nos permite conocer la posición de una cadena dentro de otra.

En C no disponemos de una función parecida (a nivel de librerías estándar), por lo que para aquellas personas que la necesitéis, podréis ver a continuación el código de una función cuyo resultado es prácticamente igual que el método de Java.

El código

/**
 * Obtiene la posición de la cadena recibida como segundo parámetro, dentro de
 * la cadena indicada en el primer parámetro.
 * @param  theString    Cadena sobre la que buscar la subcadena.
 * @param  searched  Cadena a buscar.
 * @return Índice base 0 de la subcadena si se encuentra o -1 en caso de no
 *         encontrarse.
 */
int indexOf(char * theString, char * searched) {
  int position = -1;
  char * result = null;

  if (theString && searched) {
    result = strstr(theString, searched);
    if (result) {
      position = result - theString;
    }
  }

  return position;
}

El funcionamiento del método es muy simple, se basa en la resta de punteros para obtener la posición de la subcadena.

Lo primero que hacemos es obtener el puntero a la subcadena si se encuentra en la cadena principal mediante la llamada a strstr. Una vez obtenido el puntero, restamos éste a la cadena original dándonos la "posición" del puntero de la subcadena con respecto a la cadena original.

A continuación, se muestra un ejemplo con sus respectivos resultados:

int main(int argc, char * argv[]) {
  printf("h   Posición: %i\n", indexOf("hola que tal", "h"));
  printf("tal Posición: %i\n", indexOf("hola que tal", "tal"));
  printf("que Posición: %i\n", indexOf("hola que tal", "que"));
  printf("no  Posición: %i\n", indexOf("hola que tal", "no"));
  printf("e1  Posición: %i\n", indexOf("", "no"));
  printf("e2  Posición: %i\n", indexOf("hola que tal", ""));
  printf("e12 Posición: %i\n", indexOf("", ""));
  printf("n1  Posición: %i\n", indexOf(NULL, "no"));
  printf("n2  Posición: %i\n", indexOf("hola que tal", NULL));
  printf("n12 Posición: %i\n", indexOf(NULL, NULL));
}

// Resultado
// h   Posición: 0
// tal Posición: 9
// que Posición: 5
// no  Posición: -1
// e1  Posición: -1
// e2  Posición: 0
// e12 Posición: 0
// n1  Posición: -1
// n2  Posición: -1
// n12 Posición: -1

Como podéis observar se producen los mismos resultados que con el método de Java, excepto el trabajo con valores nulos (en Java como es obvio el objeto que llama no puede ser nulo, sólo el parámetro) por lo que se ha optado por devolver en este caso -1.

Comparte este artículo con quien quieras
Jaiberdroid 0.5 beta: Nueva versión
C/C++: Texto de consola con formato

Leave a Comment

Your email address will not be published. Required fields are marked *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.