2008-08-07 13 views
37

¿Hay una función de biblioteca C que devuelva el índice de un carácter en una cadena?Función String.indexOf en C

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

Respuesta

10

Creo que

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

es lo que quiere. Aquí está un ejemplo sacado de here:

/* 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; 
} 
+10

'strcspn' es más parecido a' String.IndexOfAny() '- buscando cualquiera de los caracteres en la matriz' keys'. Pero sí, hará el truco –

+2

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

+1

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

0

Si no está totalmente atado a pura C y puede utilizar string.h hay strchr() See here

+13

No estoy seguro de lo que quiere decir con "C puro", pero strchr() y string.h han formado parte del estándar C durante 20 años. –

32

strstr devuelve un puntero al carácter encontrado, así que podría usar la aritmética de punteros: (Nota: este código no probado por su capacidad para recopilar, es un paso de 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" */ 
} 
+3

Comportamiento indefinido si no se encuentra el carácter. Además, no debería usar 'strstr' (con o sin el error tipográfico) si' strchr' fuera suficiente. –

+0

@R .. - Repare el error tipográfico y agregué la comprobación de errores al pseudocódigo. Además, 'strchr' no funciona para encontrar secuencias de caracteres múltiples, ¿o sí? – Bill

+2

De hecho, pero OP pidió un personaje, no una subcadena. Por supuesto, si interpreta el carácter ampliamente para incluir caracteres multibyte, 'strstr' es la función correcta para usar. –

11

EDIT:. strchr es mejor sólo para un carbón de leña. puntero aritmetics dice "Hellow!":

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

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

+17

¿Se le acabaron los nombres de variables?;-) –

+3

¿Por qué tu comentario ha recibido tantos upvotes? – theonlygusti

+0

@theonlygusti Pensé que esto era más reciente (leí la fecha del 15 de noviembre de 2016), y no tiene sentido revivir viejas conversaciones para explicar una mala broma. Si tuviera que adivinar, diría que un mod vio mi marca de comentario "obsoleto" y lo tomó como una señal para eliminar el comentario, ya que es ... obsoleto. O al menos sin sentido. –

3

Puede utilizar 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 
+0

UB si no hay coincidencia (resta de punteros que no están dentro del mismo objeto). –

0

Escriba su propia :)

Código de una biblioteca de procesamiento de cadenas BSD licencia para C, llamado 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; 
} 
0

Usted puede escribir

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

para encontrar el índice de 'h' en el garble dado.

+0

'strstr' podría devolver' NULL' si no se encuentra la cadena. – Ivan