Voici un exemple de travail complet,:
#include <stdio.h>
#include <string.h>
int main(void) {
char string[] = "abcdefg";
char from[] = "c";
char to[] = "f";
char *first = strstr(string, from);
if (first == NULL) {
first = &string[0];
} else {
first += strlen(from);
}
char *last = strstr(first, to);
if (last == NULL) {
last = &string[strlen(string)];
}
char *sub = calloc(strlen(string) + 1, sizeof(char));
strncpy(sub, first, last - first);
printf("%s\n", sub);
free(sub);
return 0;
}
Vous pouvez vérifier à this ideone.
Maintenant, l'explication:
1.
char string[] = "abcdefg";
char from[] = "c";
char to[] = "f";
Déclarations de chaînes: chaîne principale à vérifier, delimiter début, delimiter fin. Notez que ce sont des tableaux aussi, donc from
et to
pourraient être, par exemple, cd
et fg
, respectivement.
2.
char *first = strstr(string, from);
Trouver occurrence du delimiter début de la chaîne principale. Notez qu'il trouve l'occurrence première fois - si vous avez besoin de trouver le dernier (par exemple, si vous aviez la chaîne abcabc
, et vous vouliez une sous-chaîne de la seconde a
), il peut être différent.
3.
if (first == NULL) {
first = &string[0];
} else {
first += strlen(from);
}
situation poignée, dans laquelle le premier delimiter ne figure pas dans la chaîne. Dans ce cas, nous allons créer une sous-chaîne à partir du début de la chaîne entière. S'il apparaît, cependant, nous déplaçons le pointeur par la longueur de la chaîne from
, car nous devons extraire la sous-chaîne commençant après le premier délimiteur (correction grâce à @dau_sama). Selon vos spécifications, cela peut être nécessaire ou non, ou un autre résultat peut être attendu.
4.
char *last = strstr(first, to);
Trouver du delimiter occurence se terminant par la chaîne principale.Notez qu'il trouve la première occurrence.
Comme noté par @dau_sama, il est préférable de rechercher un délimiteur de fin à partir du first
, et non du début de la chaîne entière. Cela empêche les situations dans lesquelles to
apparaîtrait avant from
.
5.
if (last == NULL) {
last = &string[strlen(string)];
}
situation poignée, dans laquelle le second séparateur ne figure pas dans la chaîne. Dans un tel cas, nous ferons une sous-chaîne jusqu'à la fin de la chaîne, donc nous aurons un pointeur vers le dernier caractère. Encore une fois, selon vos spécifications, cela peut être nécessaire ou non, ou un autre résultat peut être attendu.
6.
char *sub = calloc(last - first + 1, sizeof(char));
strncpy(sub, first, last - first);
Allouer mémoire et extrait suffisamment sousChaîne basées sur des pointeurs trouvés précédemment. Nous copions les caractères last - first
(longueur de la sous-chaîne) à partir du caractère first
.
7.
printf("%s\n", sub);
est ici le résultat.
J'espère qu'il présente le problème avec suffisamment de détails. Selon vos spécifications exactes, vous devrez peut-être modifier cela en quelque sorte. Par exemple, si vous avez besoin de trouver toutes les sous-chaînes, et pas seulement la première, vous pouvez faire une boucle pour trouver first
et last
.
Montrez ce que vous avez essayé afin que nous puissions corriger votre code – Gopi
Cette définition est erronée 'char string =" abcdefg "'. –
Nous devons savoir * exactement * ce que vous avez, pas quelque chose * comme * vous avez. –