2015-04-21 2 views
-1

J'ai besoin d'extraire les sous-chaînes qui se trouvent entre les chaînes que je connais.Sous-chaînes au milieu d'une chaîne en C

J'ai quelque chose comme char string = "abcdefg"; Je sais ce que je dois entre "c" et "f", alors mon retour doit être "de".

Je connais la fonction strncpy() mais je ne sais pas comment l'appliquer au milieu d'une chaîne.

Merci.

+4

Montrez ce que vous avez essayé afin que nous puissions corriger votre code – Gopi

+7

Cette définition est erronée 'char string =" abcdefg "'. –

+2

Nous devons savoir * exactement * ce que vous avez, pas quelque chose * comme * vous avez. –

Répondre

-1

Puisque les gens ne semblaient pas comprendre mon approche dans les commentaires, voici un bout de hachage rapide.

const char* string = "abcdefg"; 
const char* b = "c"; 
const char* e = "f"; 
//look for the first pattern 
const char* begin = strstr(string, b); 
if(!begin) 
    return NULL; 
//look for the end pattern 
const char* end = strstr(begin, e); 
if(!end) 
    return NULL; 
end -= strlen(e); 

char result[MAXLENGTH]; 
strncpy(result, begin, end-begin); 
+0

Pourquoi 'end - = strlen (e)'? –

+0

car le deuxième motif peut être plus long que 1 caractère, et strstr renvoie le pointeur après que la chaîne entière a été trouvée. si vous aviez: const char * e = "fad" et dans votre chaîne: "fadeee", il retournerait un pointeur vers le premier "e", mais si vous voulez couper la chaîne whle, vous devez la décaler la gauche. –

-2
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *between(const char *str, char from, char to){ 
    while(*str && *str != from) 
     ++str;//skip 
    if(*str == '\0') 
     return NULL; 
    else 
     ++str; 

    char *ret = malloc(strlen(str)+1); 
    char *p = ret; 
    while(*str && *str != to){ 
     *p++ = *str++;//To the end if `to` do not exist 
    } 
    *p = 0; 
    return ret; 
} 

int main(void){ 
    const char* string = "abcdefg"; 
    char *substr = between(string, 'c', 'f'); 

    if(substr!=NULL){ 
     puts(substr); 
     free(substr); 
    } 

    return 0; 
} 
0

gars TY, travaillé en utilisant le formulaire ci-dessous:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *between_substring(char *str, char from, char to){ 
while(*str && *str != from) 
    ++str;//skip 
if(*str == '\0') 
    return NULL; 
else 
    ++str; 

char *ret = malloc(strlen(str)+1); 
char *p = ret; 
while(*str && *str != to){ 
    *p++ = *str++;//To the end if `to` do not exist 
} 
*p = 0; 
return ret; 
} 

int main (void){ 
char source[] = "abcdefg"; 
char *target; 
target = between(source, 'c', 'f'); 
printf("%s", source); 
printf("%s", target); 

return 0; 
} 
2

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.

+0

si vous vérifiez ma réponse, d'où vous avez trouvé l'inspiration pour le vôtre, vous trouverez un problème avec votre approche. char * first = strstr (string, from); char * last = strstr (string, à); le dernier peut être

+0

Bon point. Je vais éditer la réponse, merci. – rubikonx9

+0

également vous n'avez pas besoin d'allouer une chaîne si grande: char * sub = calloc (strlen (chaîne) + 1, sizeof (char)); (last - first) +1 est suffisant –