Получить индекс подстроки - PullRequest
       16

Получить индекс подстроки

21 голосов
/ 21 сентября 2011

У меня есть char * source , и я хочу извлечь из него subrting, который, как я знаю, начинается с символов "abc" и заканчивается там, где заканчивается источник.С strstr я могу получить указатель, но не положение, а без положения я не знаю длину подстроки.Как я могу получить индекс подстроки в чистом C?

Ответы [ 7 ]

41 голосов
/ 21 сентября 2011

Использовать вычитание указателя.

char *str = "sdfadabcGGGGGGGGG";
char *result = strstr(str, "abc");
int position = result - str;
int substringLength = strlen(str) - position;
6 голосов
/ 21 сентября 2011

newptr - source даст вам смещение.

3 голосов
/ 07 ноября 2017

Вот C-версия функции strpos с функцией смещения ...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int strpos(char *haystack, char *needle, int offset);
int main()
{
    char *p = "Hello there all y'al, hope that you are all well";
    int pos = strpos(p, "all", 0);
    printf("First all at : %d\n", pos);
    pos = strpos(p, "all", 10);
    printf("Second all at : %d\n", pos);
}


int strpos(char *hay, char *needle, int offset)
{
   char haystack[strlen(hay)];
   strncpy(haystack, hay+offset, strlen(hay)-offset);
   char *p = strstr(haystack, needle);
   if (p)
      return p - haystack+offset;
   return -1;
}
3 голосов
/ 21 сентября 2011
char *source = "XXXXabcYYYY";
char *dest = strstr(source, "abc");
int pos;

pos = dest - source;
2 голосов
/ 21 сентября 2011

Если у вас есть указатель на первый символ подстроки, а подстрока заканчивается в конце строки источника, то:

  • strlen(substring) даст вам его длину.
  • substring - source даст вам стартовый индекс.
1 голос
/ 21 сентября 2011

Функция для вырезания слова из строки с помощью начального и конечного слова

    string search_string = "check_this_test"; // The string you want to get the substring
    string from_string = "check";             // The word/string you want to start
    string to_string = "test";                // The word/string you want to stop

    string result = search_string;            // Sets the result to the search_string (if from and to word not in search_string)
    int from_match = search_string.IndexOf(from_string) + from_string.Length; // Get position of start word
    int to_match = search_string.IndexOf(to_string);                          // Get position of stop word
    if (from_match > -1 && to_match > -1)                                     // Check if start and stop word in search_string
    {
        result = search_string.Substring(from_match, to_match - from_match);  // Cuts the word between out of the serach_string
    }
1 голос
/ 21 сентября 2011

Формально остальные правы - substring - source действительно стартовый индекс. Но вам это не понадобится: вы бы использовали его как индекс для source. Таким образом, компилятор вычисляет source + (substring - source) как новый адрес - но просто substring будет достаточно для почти всех случаев использования.

Просто подсказка для оптимизации и упрощения.

...