2008-08-07 18 views
37

Esiste una funzione di libreria C che restituirà l'indice di un carattere in una stringa?Funzione string.indexOf in C

Finora, tutto quello che ho trovato sono funzioni come strstr che restituirà il char trovato *, non è la posizione nella stringa originale.

risposta

10

Credo che

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

è quello che vuoi. Ecco un esempio tirato da 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' è più simile a' String.IndexOfAny() '- cerca uno qualsiasi dei caratteri nella matrice' keys'. Ma sì, farà il trucco –

+2

Il commento sopra è molto importante - farlo come nell'esempio NON simula indexOf(), quindi la risposta originale è praticamente errata. – GreenieMeanie

+1

Questo è esattamente quello che stai cercando: http://stackoverflow.com/a/1479401/3395760 –

0

Se non si è del tutto legato al puro C e può utilizzare string.h c'è strchr() See here

+13

Non sono sicuro di cosa intendiate per "pura C", ma strchr() e string.h sono stati parte dello standard C per 20 anni. –

32

strstr restituisce un puntatore al carattere trovato, così si potrebbe usare l'aritmetica dei puntatori: (Nota: questo codice non testato per la sua capacità di compilare, è ad un passo dal pseudocodice)

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

Comportamento indefinito se il carattere non viene trovato. Inoltre non dovresti usare 'strstr' (con o senza typo) se' strchr' sarebbe sufficiente. –

+0

@R .. - Ho corretto l'errore di battitura e aggiunto il controllo degli errori allo pseudocodice. Inoltre, 'strchr' non funziona per trovare sequenze multi-carattere, vero? – Bill

+2

Infatti, ma OP ha richiesto un carattere non una sottostringa. Ovviamente se interpretate il carattere in modo ampio per includere caratteri multibyte, 'strstr' è la funzione giusta da usare. –

11

EDIT:. strchr è meglio per un solo carattere. Pointer aritmetics dice "Hellow!":

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

Importante: strchr() restituisce NULL se non stringa viene trovata

+17

hai esaurito i nomi delle variabili?;-) –

+3

Perché il tuo commento ha ottenuto così tanti voti positivi? – theonlygusti

+0

@theonlygusti Pensavo che fosse più recente (ho letto la data il 15 novembre '16), e non ha senso rivivere vecchie conversazioni per spiegare un brutto scherzo. Se dovessi indovinare, direi che una mod ha visto la mia bandiera di commento "obsoleto" e l'ha presa come spunto per cancellare il commento, dal momento che è ... obsoleto. O almeno inutile. –

3

È possibile utilizzare strstr per compiere ciò che si desidera. Esempio:

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

int position = b - a; 

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

Questo produce il risultato:

the offset is 6 
+0

UB se non c'è corrispondenza (sottrazione di puntatori non all'interno dello stesso oggetto). –

0

Scrivi la tua :)

Codice da una libreria di elaborazione delle stringhe BSD licenza per la C, chiamato 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

È possibile scrivere

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

per trovare l'indice di 'h' nella traccia specificata.

+0

'strstr' potrebbe restituire' NULL' se la stringa non è stata trovata. – Ivan