char * sourceがあり、それから抽出したいのですが、これはシンボル「abc」から始まり、sourceが終わるところで終わることを知っています。 strstrを使用すると、位置を取得することはできますが、位置を取得することはできません。位置がないと、部分文字列の長さがわかりません。純粋なCで部分文字列のインデックスを取得するにはどうすればよいですか?
ポインター減算を使用します。
char *str = "sdfadabcGGGGGGGGG";
char *result = strstr(str, "abc");
int position = result - str;
int substringLength = strlen(str) - position;
newptr - source
はオフセットを提供します。
これは、オフセット機能を備えた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;
}
char *source = "XXXXabcYYYY";
char *dest = strstr(source, "abc");
int pos;
pos = dest - source;
部分文字列の最初の文字へのポインタがあり、部分文字列がソース文字列の最後で終わっている場合:
strlen(substring)
はその長さを示します。substring - source
は、開始インデックスを提供します。正式には他の人は正しいです-_substring - source
_は確かに開始インデックスです。ただし、それは必要ありません。source
へのインデックスとして使用します。そのため、コンパイラはsource + (substring - source)
を新しいアドレスとして計算しますが、ほぼすべてのユースケースでsubstring
で十分です。
最適化と単純化のための単なるヒント。
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
}