J'ai char * source, et je veux en extraire un sous-titrage, que je sais commence par les symboles "abc", et se termine là où la source se termine. Avec strstr je peux obtenir le pointeur, mais pas la position, et sans position je ne connais pas la longueur de la sous-chaîne. Comment obtenir l'index de la sous-chaîne en C pur?
Utilisez la soustraction du pointeur.
char *str = "sdfadabcGGGGGGGGG";
char *result = strstr(str, "abc");
int position = result - str;
int substringLength = strlen(str) - position;
newptr - source
vous donnera le décalage.
Voici une version C de la fonction strpos avec une fonction offset ...
#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;
Si vous avez le pointeur sur le premier caractère de la sous-chaîne et que la sous-chaîne se termine à la fin de la chaîne source, alors:
strlen(substring)
vous donnera sa longueur.substring - source
vous donnera l'index de départ.Formellement, les autres ont raison - substring - source
Est en effet l'index de départ. Mais vous n'en aurez pas besoin: vous l'utiliserez comme index dans source
. Ainsi, le compilateur calcule source + (substring - source)
comme nouvelle adresse - mais juste substring
serait suffisant pour presque tous les cas d'utilisation.
Juste un indice d'optimisation et de simplification.
Une fonction pour couper un mot d'une chaîne par un mot de début et de fin
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
}