web-dev-qa-db-fra.com

Obtenir l'index de la sous-chaîne

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?

22
Country

Utilisez la soustraction du pointeur.

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

newptr - source vous donnera le décalage.

6
mkb

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

pos = dest - source;
3
KevinDTimm

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.
2
Graham Borland

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.

1
glglgl

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
    }
1
StrongLucky