Функция String.indexOf в C

Есть ли функция библиотеки C, которая будет возвращать индекс символа в строке?

Пока что все, что я нашел, это функции типа strstr, которые будут возвращать найденный символ *, а не его местоположение в исходной строке.

7.08.2008 15:00:34
7 ОТВЕТОВ
РЕШЕНИЕ

я так думаю

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

это то, что вы хотите. Вот пример, извлеченный отсюда :

/* 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;
}
15
7.08.2008 15:09:30
strcspnбольше похоже String.IndexOfAny()- поиск любых символов в keysмассиве. Но да, это сделает свое дело
Isak Savo 19.03.2010 06:25:36
Приведенный выше комментарий очень важен - его выполнение, как в примере, НЕ имитирует indexOf (), поэтому исходный ответ в значительной степени неверен.
GreenieMeanie 15.11.2011 16:59:19
Это именно то, что вы ищете: stackoverflow.com/a/1479401/3395760
Alessandro Muzzi 14.06.2016 23:08:01

Если вы не полностью привязаны к чистому C и можете использовать string.h, есть strchr (). Смотрите здесь

0
7.08.2008 15:04:16
Я не уверен, что вы подразумеваете под «чистым C», но strchr () и string.h были частью стандарта C в течение 20 лет.
Robert Gamble 17.10.2008 04:34:44

strstr возвращает указатель на найденный символ, поэтому вы можете использовать арифметику указателя: (Примечание: этот код не проверен на его способность компилировать, он находится в шаге от псевдокода.)

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" */
}
34
24.10.2010 23:33:33
Неопределенное поведение, если персонаж не найден. Также вы не должны использовать strstr(с или без опечатки), если strchrбудет достаточно.
R.. GitHub STOP HELPING ICE 24.10.2010 04:51:56
@R .. - Я исправил опечатку и добавил проверку ошибок в псевдокоде. Кроме того, strchrне работает для поиска многосимвольных последовательностей, не так ли?
Bill 24.10.2010 23:35:10
Действительно, но OP запросил символ, а не подстроку. Конечно, если вы широко интерпретируете символ для включения многобайтовых символов, strstrэто правильная функция для использования.
R.. GitHub STOP HELPING ICE 25.10.2010 00:33:27
@R .. - Поскольку ОП говорило о символе как в тексте, а не как в имени charхранилища, я дал решение, которое имеет надежду работать для символа, подобного 輪. Вы возражаете?
Bill 25.10.2010 03:30:07

РЕДАКТИРОВАТЬ: strchr лучше только для одного символа. Указатель арифметики гласит «Привет!»:

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

Важно: strchr () возвращает NULL, если строка не найдена

12
24.10.2010 12:51:05

Вы можете использовать strstr для достижения желаемого. Пример:

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

int position = b - a;

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

Это дает результат:

the offset is 6
3
7.08.2008 15:07:47
UB, если совпадения нет (вычитание указателей не в пределах одного и того же объекта).
R.. GitHub STOP HELPING ICE 24.10.2010 04:52:49

Напишите свой собственный :)

Код из лицензированной библиотеки обработки строк BSD для C, называемый 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
18.02.2016 23:49:39

Ты можешь написать

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

найти указатель 'h'на данный мусор.

0
15.01.2018 14:38:31
strstrможет вернуться, NULLесли строка не найдена.
StaceyGirl 15.01.2018 14:38:08