2010-12-14 6 views
1

J'essaye d'écrire un programme en C, ce qui me permettra d'obtenir une chaîne que je veux entre deux autres chaînes qui seront définies. Pour être plus précis, mon exemple chaîne estobtenir la sous-chaîne de la chaîne en C

"blahblah<mailto:[email protected]>blahblahblah" 

et je dois être en mesure d'extraire la sous-chaîne « de agent007 » à une nouvelle variable. J'ai essayé la méthode strtok(), mais la chose est que je ne peux pas extraire les jetons vers une nouvelle variable ou un tableau. J'ai tokenized la chaîne et la déclaration qui serait bien me serait quelque chose comme "si jeton [i] ==" mailto "& & jeton [i + 2] ==" exemple "puis mailAdd = jeton [i + 1 ] " (d'une manière pseudo-code :))

mon programme jusqu'à présent

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

int main() 
{ 
    char str[] ="blahblah<mailto:[email protected]>blahblahblah"; 
    char * tch; 
    tch = strtok (str,"<:@"); 
    while (tch != NULL) 
    { 
    printf ("%s\n",tch); 
    tch = strtok (NULL, "<:@"); 
    } 
    return 0; 
} 

Bien sûr, toute autre suggestion au-delà de jetons sera grandement appréciée -

+0

Les jetons me semblent raisonnables. Je ne suis pas clair sur le problème que vous rencontrez. Pourquoi ne pouvez-vous pas extraire les jetons? –

+0

Bonjour Jonathan. Je n'arrive pas à trouver un moyen d'exporter le jeton vers un char var et plus tard l'utiliser dans le programme pour d'autres calculs. Ai-je du sens? :) –

+0

Si vous voulez le réutiliser, vous devez copier la chaîne 'tch' quelque part:' tch' change lui-même. Notez que 'strtok' change la chaîne d'origine. Après votre boucle, (si je n'ai pas gâché les calculs), 'str + 0' pointe vers" blahblah "; 'str + 9' ​​pointe vers" mailto "; 'str + 16' pointe vers" agent007 "; et 'str + 25' pointe vers" exemple.org> blahblahblah ". – pmg

Répondre

2

ma première pensée était de utilisez strstr pour "mailto:" et strchr pour le '@'

// pseudo code 
char *mailto = strstr(src, "mailto:"); // possibly convert src to lowercase 
char *atsign = strchr(mailto, '@'); 
while (mailto < atsign) *dst++ = *mailto++; 

Bien sûr, c'est un brouillon très approximatif. Il a besoin de beaucoup de raffinage (incapacité à trouver la "mailto:" string ou '@' char, vérification des erreurs, des cas particuliers, des tests, ...)


Enregistrement du pointeur strtok

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

int main() 
{ 
    char str[] ="blahblah<mailto:[email protected]>blahblahblah"; 
    char * tch; 
    char * saved;      /* pmg */ 
    tch = strtok (str,"<:@"); 
    while (tch != NULL) 
    { 
    int savenext = 0;    /* pmg */ 
    if (!strcmp(tch, "mailto"))  /* pmg, UNTESTED CODE, need to check case? */ 
    {        /* pmg */ 
     savenext = 1;     /* pmg */ 
    }        /* pmg */ 
    printf ("%s\n",tch); 
    tch = strtok (NULL, "<:@"); 
    if (savenext == 1)    /* pmg, UNTESTED CODE */ 
    {        /* pmg */ 
     saved = tch;     /* pmg */ 
    }        /* pmg */ 
    } 
    printf ("saved: %s\n", saved); /* pmg */ 
    return 0; 
} 
+0

Bonne réflexion @pmg! :-) –

+0

Eh bien, je vois ce que tu as fait :) Testé et travaillé comme un charme. Merci un zillion pmg :) –

1

Vous pouvez utiliser strstr pour rechercher 'mailto:', puis strchr pour rechercher '@' et prendre les caractères intermédiaires. Je n'utilise jamais strtok mais je ne vois pas ce qui ne va pas avec ce que vous avez fait.

Voici un exemple où email doit pointer sur "agent007" dans votre cas. La gestion des erreurs est manquante ici. C'est destructeur, ce qui signifie qu'il modifie la chaîne d'entrée, mais il en est de même pour strtok.

char *mailto = strstr(str, "mailto:"); 
char *at = strchr(mailto, '@'); 
char *email = mailto + strlen("mailto:"); 
*at = '\0'; 
+0

+1 'strtok' suce :) – pmg

+0

C'est pourtant le problème auquel je suis confronté. :) Comment puis-je prendre ces caractères? –