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.
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.
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;
}
Jeśli nie są całkowicie związane z czystym C i może korzystać string.h jest strchr() See here
Nie jestem pewien, co masz na myśli przez "czysty C", ale strchr() i string.h są częścią standardu C przez 20 lat. –
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" */
}
Niezdefiniowane zachowanie, jeśli znak nie zostanie znaleziony. Nie powinieneś też używać 'strstr' (z lub bez literówki), jeśli wystarczyłoby' strchr'. –
@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
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ą. –
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
Czy zabrakło ci nazw zmiennych?;-) –
Dlaczego twój komentarz dostał tak dużo awansów? – theonlygusti
@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. –
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
UB, jeśli nie ma dopasowania (odejmowanie wskaźników spoza tego samego obiektu). –
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;
}
Ty można napisać:
s="bvbrburbhlkvp";
int index=strstr(&s,"h")-&s;
, aby znaleźć indeks 'h'
w danym garble.
'Strstr' może zwrócić' NULL' jeśli łańcuch nie został znaleziony. – Ivan
'strcspn' jest bardziej podobne do' String.IndexOfAny() '- wyszukując dowolny znak w tablicy' keys'. Ale tak, to zadziała –
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
Dokładnie to, czego szukasz: http://stackoverflow.com/a/1479401/3395760 –