2008-08-07 5 views
37

Gibt es eine C-Bibliothek-Funktion, die den Index eines Zeichens in einer Zeichenfolge zurückgibt?String.indexOf Funktion in C

Bisher habe ich nur Funktionen wie strstr gefunden, die das gefundene Zeichen * zurückgeben, nicht seine Position in der ursprünglichen Zeichenkette.

Antwort

10

Ich denke, dass

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

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

int position = b - a; 

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

Dies ist das Ergebnis erzeugt

ist was Sie wollen. Hier ist ein Beispiel aus here gezogen:

/* 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' ist mehr wie' String.IndexOfAny() '- sucht nach einem der Zeichen im Array' keys'. Aber ja, es wird den Trick machen –

+2

Der obige Kommentar ist sehr wichtig - es wie im Beispiel zu tun, imitiert nicht indexOf(), also ist die ursprüngliche Antwort ziemlich falsch. – GreenieMeanie

+1

Dies ist genau das, was Sie suchen: http://StackOverflow.com/a/1479401/3395760 –

0

Wenn Sie nicht ganz reinem C gebunden und können string.h gibt es strchr() See here

+13

Ich bin nicht sicher, was Sie mit "reinem C" meinen, aber strchr() und string.h sind seit 20 Jahren Teil von Standard C. –

32

strstr gibt einen Zeiger auf den gefundenen Zeichen, so dass Sie die Zeigerarithmetik verwenden: (Anmerkung: diese Code nicht auf seine Fähigkeit getestet zu kompilieren, dann ist es ein Schritt weg von Pseudo-Code)

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

Undefiniertes Verhalten, wenn das Zeichen nicht gefunden wird. Auch sollten Sie 'strstr' (mit oder ohne Tippfehler) nicht verwenden, wenn' strchr' ausreichen würde. –

+0

@R .. - Ich habe den Tippfehler korrigiert und Fehlerprüfung zum Pseudocode hinzugefügt. Auch "strchr" funktioniert nicht zum Auffinden von Multi-Zeichen-Sequenzen, oder? – Bill

+2

In der Tat, OP fragte nach einem Zeichen, nicht nach einem Teilstring. Natürlich, wenn Sie Zeichen breit interpretieren, um Multibyte-Zeichen einzuschließen, ist 'strstr' die richtige zu verwendende Funktion. –

11

EDIT:. strchr besser ist nur für ein Zeichen. Pointer aritmetics sagt "Hellow!":

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

Wichtig: strchr() gibt NULL, wenn keine Zeichenfolge

+17

Haben Sie keine Variablennamen mehr?;-) –

+3

Warum hat Ihr Kommentar so viele Upvotes bekommen? – theonlygusti

+0

@theonlygusti Ich dachte, das wäre neuer (ich las das Datum als 15. November 16), und es hat keinen Sinn, alte Unterhaltungen wiederzubeleben, um einen schlechten Witz zu erklären. Wenn ich raten müsste, würde ich sagen, dass ein Mod mein "veraltetes" Kommentar-Flag gesehen hat und das als Hinweis genommen hat, den Kommentar zu löschen, da es ... veraltet ist. Oder zumindest sinnlos. –

3

gefunden wird, kann Sie strstr verwenden, um zu erreichen, was Sie wollen. Beispiel:

the offset is 6 
+0

UB, wenn keine Übereinstimmung vorliegt (Subtraktion von Zeigern, die sich nicht im selben Objekt befinden). –

0

Schreiben Sie Ihren eigenen :)

-Code aus einer BSD Lizenz String Verarbeitungsbibliothek für C, genannt 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

Sie kann schreiben

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

finden Sie den Index in der gegebenen Verstümmelung.

+0

'strstr' könnte' NULL' zurückgeben, wenn keine Zeichenfolge gefunden wurde. – Ivan