Función String.indexOf en C

3 minutos de lectura

¿Existe una función de biblioteca C que devuelva el índice de un carácter en una cadena?

Hasta ahora, todo lo que he encontrado son funciones como strstr que devolverán el carácter * encontrado, no su ubicación en la cadena original.

avatar de usuario
Cuenta

strstr devuelve un puntero al carácter encontrado, por lo que podría usar la aritmética de punteros: (Nota: este código no ha probado su capacidad de compilación, está a un paso del pseudocódigo).

char * source = "test string";         /* assume source address is */
                                       /* 0x10 for example */
char * found = strstr( source, "in" ); /* should return 0x18 */
if (found != NULL)                     /* strstr returns NULL if item not found */
{
  int index = found - source;          /* index is 8 */
                                       /* source[8] gets you "i" */
}

  • Comportamiento indefinido si no se encuentra el carácter. Tampoco debes usar strstr (con o sin el error tipográfico) si strchr bastaría.

    – R.. GitHub DEJA DE AYUDAR A ICE

    24 de octubre de 2010 a las 4:51

  • @R.. – Arreglé el error tipográfico y agregué la verificación de errores al pseudocódigo. También, strchr no funciona para encontrar secuencias de varios caracteres, ¿verdad?

    – Cuenta

    24/10/2010 a las 23:35


  • De hecho, pero OP solicitó un carácter, no una subcadena. Por supuesto, si interpreta el carácter de manera amplia para incluir caracteres de varios bytes, strstr es la función correcta para usar.

    – R.. GitHub DEJA DE AYUDAR A ICE

    25 de octubre de 2010 a las 0:33

  • @R .. – Dado que el OP estaba hablando de un personaje como en el texto, no como en el char nombre de almacenamiento, di una solución que tiene la esperanza de funcionar para un personaje como 輪. ¿Objetas?

    – Cuenta

    25 de octubre de 2010 a las 3:30


pienso que

size_t strcspn (const char * str1, const char * str2);

es lo que quieres Aquí hay un ejemplo extraído de aquí:

/* strcspn example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "fcba73";
  char keys[] = "1234567890";
  int i;
  i = strcspn (str,keys);
  printf ("The first number in str is at position %d.\n",i+1);
  return 0;
}

  • strcspn es más como String.IndexOfAny() – buscando cualquiera de los personajes en el keys formación. Pero sí, hará el truco.

    –Isak Savo

    19 de marzo de 2010 a las 6:25

  • El comentario anterior es muy importante: hacerlo como en el ejemplo NO imita indexOf(), por lo que la respuesta original es bastante incorrecta.

    – GreenieMeanie

    15 de noviembre de 2011 a las 16:59

  • Esto es exactamente lo que está buscando: stackoverflow.com/a/1479401/3395760

    – Alessandro Muzzi

    14 de junio de 2016 a las 23:08


avatar de usuario
Michal Sznajder

EDITAR: strchr es mejor solo para un carácter. La aritmética de punteros dice “¡Hola!”:

char *pos = strchr (myString, '#');
int pos = pos ? pos - myString : -1;

Importante: strchr () devuelve NULL si no se encuentra ninguna cadena

Puede usar strstr para lograr lo que desea. Ejemplo:

char *a = "Hello World!";
char *b = strstr(a, "World");

int position = b - a;

printf("the offset is %i\n", position);

Esto produce el resultado:

the offset is 6

Si no está totalmente atado a C puro y puede usar string.h, hay strchr()
Mira aquí

  • No estoy seguro de lo que quiere decir con “C puro”, pero strchr() y string.h han sido parte de Standard C durante 20 años.

    – Roberto Gamble

    17 de octubre de 2008 a las 4:34

avatar de usuario
fnisi

Escribe lo tuyo 🙂

Código de una biblioteca de procesamiento de cadenas con licencia BSD para C, llamada zString

https://github.com/fnoyanisi/zString

int zstring_search_chr(char *token,char s){
    if (!token || s=='\0')
        return 0;

    for (;*token; token++)
        if (*token == s)
            return 1;

    return 0;
}

  • No estoy seguro de lo que quiere decir con “C puro”, pero strchr() y string.h han sido parte de Standard C durante 20 años.

    – Roberto Gamble

    17 de octubre de 2008 a las 4:34

avatar de usuario
klutt

Puedes escribir

s="bvbrburbhlkvp";
int index=strstr(&s,"h")-&s;

para encontrar el índice de 'h' en la jerga dada.

  • strstr podría volver NULL si no se encontró la cadena.

    – StaceyGirl

    15 de enero de 2018 a las 14:38

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad