Funcția String.indexOf în C

Există o funcție de bibliotecă C care va returna indexul unui caracter într-un șir?

Până în prezent, tot ce am găsit sunt funcții precum strstr, care vor returna caracterele găsite *, nu este locația în șirul original.

0
fr hi bn

7 răspunsuri

If you are not totally tied to pure C and can use string.h there is strchr() See here

0
adăugat
Nu sunt sigur ce vrei să spui prin "pur C", dar strchr() și string.h au făcut parte din Standardul C timp de 20 de ani.
adăugat autor Robert Gamble, sursa

EDIT: strchr este mai bine doar pentru un caracter. Pointer aritmetics spune "Hellow!":

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

Important: strchr() returns NULL if no string is found

0
adăugat
ai terminat numele de variabile? ;-)
adăugat autor Isak Savo, sursa
De ce ți-a primit comentariul atât de multe?
adăugat autor theonlygusti, sursa
@theonlygusti M-am gândit că acest lucru a fost mai recent (am citit data de 15 noiembrie 1616), și nu are rost să revigor vechile conversații pentru a explica o glumă proastă. Dacă ar fi trebuit să ghicesc, aș spune că un mod a văzut drapelul meu de comentariu "învechit" și a luat-o ca un indiciu pentru a șterge comentariul, deoarece este ... depășit. Sau cel puțin inutil.
adăugat autor Nic Hartley, sursa

Puteți utiliza strstr pentru a realiza ceea ce doriți. Exemplu:

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

int position = b - a;

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

Aceasta produce rezultatul:

the offset is 6
0
adăugat
UB dacă nu există nici o potrivire (scăderea indicilor care nu se află în același obiect).
adăugat autor R.., sursa

Scrie-ti propriul :)

Code from a BSD licensed string processing library for C, called 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
adăugat

strstr returns a pointer to the found character, so you could use pointer arithmetic: (Note: this code not tested for its ability to compile, it's one step away from pseudocode.)

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" */
}
0
adăugat
Comportament nedefinit în cazul în care caracterul nu este găsit. De asemenea, nu trebuie să utilizați strstr (cu sau fără tastatură) dacă strchr ar fi suficientă.
adăugat autor R.., sursa
Într-adevăr, dar OP a cerut un caracter, nu un substring. Desigur, dacă interpretați în întregime caracterul pentru a include caracterele multiple, strstr este funcția corectă de utilizat.
adăugat autor R.., sursa
@R .. - Am reparat tipografia și am adăugat o eroare la pseudocod. De asemenea, strchr nu funcționează pentru a găsi secvențe cu mai multe caractere, nu-i așa?
adăugat autor Bill, sursa
@R .. - Din moment ce OP a vorbit despre un personaj ca si in text, nu ca in numele de stocare char , am dat o solutie care are speranta de a lucra pentru un personaj ca? Obiectați?
adăugat autor Bill, sursa

cred ca

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

este ceea ce vrei. Iată un exemplu tras de la aici :

/* strcspn example */
#include 
#include 

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;
}
0
adăugat
Comentariul de mai sus este foarte important - face-l ca în exemplul NU seamănă cu indexOf (), deci răspunsul original este destul de greșit.
adăugat autor GreenieMeanie, sursa
strcspn este mai mult ca String.IndexOfAny() - căutarea oricăror caractere din matricea cheie . Dar da, va face truc
adăugat autor Isak Savo, sursa
Acest lucru este exact ceea ce căutați: stackoverflow.com/a/1479401/3395760
adăugat autor Ale Muzzi, sursa

Poti sa scrii

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

pentru a găsi indexul 'h' în garblele date.

0
adăugat
strstr s-ar putea întoarce NULL dacă șirul nu a fost găsit.
adăugat autor Ivan, sursa