String.indexOf function in C
Asked Answered
A

7

47

Is there a C library function that will return the index of a character in a string?

So far, all I've found are functions like strstr that will return the found char *, not it's location in the original string.

Advent answered 7/8, 2008 at 15:0 Comment(0)
M
16

I think that

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

is what you want. Here is an example pulled from 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;
}
Menstruum answered 7/8, 2008 at 15:9 Comment(4)
strcspn is more like String.IndexOfAny() - searching for any of the characters in the keys array. But yeah, it'll do the trickAmbivert
The above comment is very important - doing it as in the example DOES NOT mimic indexOf(), so the original answer is pretty much incorrect.Leckie
This is exactily what you are looking for: https://mcmap.net/q/332353/-is-there-a-function-in-c-that-will-return-the-index-of-a-char-in-a-char-arrayUrdar
Updated here link in case anyone wants it ...Werth
D
39

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" */
}
Daze answered 7/8, 2008 at 15:4 Comment(4)
Undefined behavior if the character is not found. Also you should not use strstr (with or without the typo) if strchr would suffice.Drink
@R.. - I fixed the typo and added error checking to the pseudocode. Also, strchr does not work for finding multi-character sequences, does it?Daze
Indeed, but OP asked for a character not a substring. Of course if you interpret character broadly to include multibyte characters, strstr is the right function to use.Drink
@R.. - Since the OP was talking about a character as in text, not as in the char storage name, I gave a solution that has a hope of working for a character like 輪. You object?Daze
M
16

I think that

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

is what you want. Here is an example pulled from 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;
}
Menstruum answered 7/8, 2008 at 15:9 Comment(4)
strcspn is more like String.IndexOfAny() - searching for any of the characters in the keys array. But yeah, it'll do the trickAmbivert
The above comment is very important - doing it as in the example DOES NOT mimic indexOf(), so the original answer is pretty much incorrect.Leckie
This is exactily what you are looking for: https://mcmap.net/q/332353/-is-there-a-function-in-c-that-will-return-the-index-of-a-char-in-a-char-arrayUrdar
Updated here link in case anyone wants it ...Werth
C
14

EDIT: strchr is better only for one char. Pointer aritmetics says "Hellow!":

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

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

Calore answered 7/8, 2008 at 15:5 Comment(1)
You might want to rewrite the second line as int ipos = pos ? pos - myString : -1; to avoid compiler errors - but otherwise this still works in 2023!Werth
C
4

You can use strstr to accomplish what you want. Example:

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

int position = b - a;

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

This produces the result:

the offset is 6
Carolyncarolyne answered 7/8, 2008 at 15:7 Comment(1)
UB if there is no match (subtraction of pointers not within the same object).Drink
W
0

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

Walkin answered 7/8, 2008 at 15:4 Comment(1)
I'm not sure what you mean by "pure C" but strchr() and string.h have been part of Standard C for 20 years.Troublous
H
0

Write your own :)

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;
}
Hotchpot answered 18/2, 2016 at 23:49 Comment(0)
C
0

You can write

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

to find the index of 'h' in the given garble.

Clustered answered 15/1, 2018 at 14:18 Comment(1)
strstr might return NULL if string was not found.Gas

© 2022 - 2024 — McMap. All rights reserved.