2008-08-07 36 views
37

Czy istnieje funkcja biblioteki C, która zwróci indeks znaku w łańcuchu?Funkcja String.indexOf w C

Do tej pory znalazłem tylko funkcje takie jak strstr, które zwrócą znaleziony znak *, a nie jego położenie w oryginalnym łańcuchu znaków.

Odpowiedz

10

ja że

size_t strcspn (char * słowo1, char * słowo2);

jest to, co chcesz. Oto przykład pociągnął z 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' jest bardziej podobne do' String.IndexOfAny() '- wyszukując dowolny znak w tablicy' keys'. Ale tak, to zadziała –

+2

Powyższy komentarz jest bardzo ważny - robi to tak, jak w przykładzie NIE naśladuje indexOf(), więc oryginalna odpowiedź jest prawie niepoprawna. – GreenieMeanie

+1

Dokładnie to, czego szukasz: http://stackoverflow.com/a/1479401/3395760 –

0

Jeśli nie są całkowicie związane z czystym C i może korzystać string.h jest strchr() See here

+13

Nie jestem pewien, co masz na myśli przez "czysty C", ale strchr() i string.h są częścią standardu C przez 20 lat. –

32

strstr zwraca wskaźnik do znalezionego znaku, więc można użyć wskaźnika arytmetyki: (Uwaga: kod nie testowane pod kątem jego zdolności do kompilacji, to krok od Pseudokod)

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

Niezdefiniowane zachowanie, jeśli znak nie zostanie znaleziony. Nie powinieneś też używać 'strstr' (z lub bez literówki), jeśli wystarczyłoby' strchr'. –

+0

@R .. - Naprawiłem literówkę i dodałem sprawdzanie błędów do pseudokodu. Ponadto 'strchr' nie działa w celu znalezienia sekwencji wieloznakowych, prawda? – Bill

+2

Rzeczywiście, ale OP poprosił o znak, a nie podłańcuch. Oczywiście, jeśli szeroko interpretujesz postać, aby zawierała znaki wielobajtowe, funkcja "strstr" jest odpowiednią funkcją. –

11

EDIT:. strchr jest lepszy tylko dla jednego char. Pointer aritmetics mówi "Hellow!":

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

Ważne: strchr() zwraca NULL jeśli nie zostanie znaleziony ciąg

+17

Czy zabrakło ci nazw zmiennych?;-) –

+3

Dlaczego twój komentarz dostał tak dużo awansów? – theonlygusti

+0

@theonlygusti Myślałem, że to nowsza wersja (czytałem datę 15 listopada 16) i nie ma sensu odnawiać starych rozmów, żeby wytłumaczyć zły żart. Gdybym miał zgadywać, powiedziałbym, że mod zobaczył moją "przestarzałą" flagę komentarza i potraktował to jako wskazówkę do usunięcia komentarza, ponieważ jest ... przestarzały. A przynajmniej bezcelowe. –

3

strstr można użyć do osiągnięcia tego, co chcesz. Przykład:

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

int position = b - a; 

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

To daje wynik:

the offset is 6 
+0

UB, jeśli nie ma dopasowania (odejmowanie wskaźników spoza tego samego obiektu). –

0

Napisz :)

kod z licencją BSD biblioteki przetwarzania ciąg dla C, zwany 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

Ty można napisać:

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

, aby znaleźć indeks 'h' w danym garble.

+0

'Strstr' może zwrócić' NULL' jeśli łańcuch nie został znaleziony. – Ivan