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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
45
0
85 946
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

Я не уверен, что вы имеете в виду под «чистым C», но strchr () и string.h были частью Standard C в течение 20 лет.

Robert Gamble 17.10.2008 08:34

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.. GitHub STOP HELPING ICE 24.10.2010 08:51

@R .. - Я исправил опечатку и добавил в псевдокод проверку ошибок. Кроме того, strchr не работает для поиска многосимвольных последовательностей, не так ли?

Bill 25.10.2010 03:35

Действительно, но OP запросил символ, а не подстроку. Конечно, если вы интерпретируете символы в широком смысле, включая многобайтовые символы, strstr - правильная функция для использования.

R.. GitHub STOP HELPING ICE 25.10.2010 04:33

@R .. - Поскольку OP говорил о символе как в тексте, а не как в имени хранилища char, я дал решение, которое надеется работать с таким символом, как 輪. Вы возражаете?

Bill 25.10.2010 07:30

Обновлено: 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, если совпадения нет (вычитание указателей не в одном объекте).

R.. GitHub STOP HELPING ICE 24.10.2010 08:52
Ответ принят как подходящий

я думаю что

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. Но да, это поможет

Isak Savo 19.03.2010 09:25

Приведенный выше комментарий очень важен - выполнение его, как в примере, НЕ имитирует indexOf (), поэтому исходный ответ в значительной степени неверен.

GreenieMeanie 15.11.2011 20:59

Это именно то, что вы ищете: stackoverflow.com/a/1479401/3395760

Alessandro Muzzi 15.06.2016 02:08

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

Код из лицензированной 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, если строка не найдена.

StaceyGirl 15.01.2018 17:38

Другие вопросы по теме