web-dev-qa-db-ja.com

部分文字列のインデックスを取得

char * sourceがあり、それから抽出したいのですが、これはシンボル「abc」から始まり、sourceが終わるところで終わることを知っています。 strstrを使用すると、位置を取得することはできますが、位置を取得することはできません。位置がないと、部分文字列の長さがわかりません。純粋なCで部分文字列のインデックスを取得するにはどうすればよいですか?

22
Country

ポインター減算を使用します。

char *str = "sdfadabcGGGGGGGGG";
char *result = strstr(str, "abc");
int position = result - str;
int substringLength = strlen(str) - position;
43

newptr - sourceはオフセットを提供します。

6
mkb

これは、オフセット機能を備えたstrpos関数のCバージョンです...

#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
Howard J
char *source = "XXXXabcYYYY";
char *dest = strstr(source, "abc");
int pos;

pos = dest - source;
3
KevinDTimm

部分文字列の最初の文字へのポインタがあり、部分文字列がソース文字列の最後で終わっている場合:

  • strlen(substring)はその長さを示します。
  • substring - sourceは、開始インデックスを提供します。
2
Graham Borland

正式には他の人は正しいです-_substring - source_は確かに開始インデックスです。ただし、それは必要ありません。sourceへのインデックスとして使用します。そのため、コンパイラはsource + (substring - source)を新しいアドレスとして計算しますが、ほぼすべてのユースケースでsubstringで十分です。

最適化と単純化のための単なるヒント。

1
glglgl

Wordの開始と終了によって文字列からWordを切り取る関数

    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
StrongLucky