




Если вы не полностью привязаны к чистому C и можете использовать string.h, есть strchr () Глянь сюда
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" */
}
Неопределенное поведение, если персонаж не найден. Также не следует использовать strstr (с опечаткой или без нее), если strchr подойдет.
@R .. - Я исправил опечатку и добавил в псевдокод проверку ошибок. Кроме того, strchr не работает для поиска многосимвольных последовательностей, не так ли?
Действительно, но OP запросил символ, а не подстроку. Конечно, если вы интерпретируете символы в широком смысле, включая многобайтовые символы, strstr - правильная функция для использования.
@R .. - Поскольку OP говорил о символе как в тексте, а не как в имени хранилища char, я дал решение, которое надеется работать с таким символом, как 輪. Вы возражаете?
Обновлено: strchr лучше только для одного символа. Арифметика указателя говорит «Привет!»:
char *pos = strchr (myString, '#');
int pos = pos ? pos - myString : -1;
Важный: strchr () возвращает NULL, если строка не найдена
Вы можете использовать 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
UB, если совпадения нет (вычитание указателей не в одном объекте).
я думаю что
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;
}
strcspn больше похож на String.IndexOfAny() - поиск любого символа в массиве keys. Но да, это поможет
Приведенный выше комментарий очень важен - выполнение его, как в примере, НЕ имитирует indexOf (), поэтому исходный ответ в значительной степени неверен.
Это именно то, что вы ищете: stackoverflow.com/a/1479401/3395760
Напишите свой :)
Код из лицензированной 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;
}
Ты можешь написать
s = "bvbrburbhlkvp";
int index=strstr(&s,"h")-&s;
чтобы найти индекс 'h' в данном искажении.
strstr может вернуть NULL, если строка не найдена.
Я не уверен, что вы имеете в виду под «чистым C», но strchr () и string.h были частью Standard C в течение 20 лет.