2010-12-14 20 views
1

Ich versuche, ein Programm in C zu schreiben, die mir eine Zeichenfolge, die ich möchte, zwischen zwei anderen Zeichenfolgen, die definiert werden, erhalten wird. Um genauer zu sein, mein Beispiel StringGet Teilstring von String in C

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

und ich muss in der Lage sein, die „Agent007“ Teilkette auf eine neue Variable zu extrahieren. Ich habe die Methode strtok() ausprobiert, aber die Sache ist, dass ich die Token nicht zu einer neuen Variablen oder einem Array extrahieren kann. Ich habe die Zeichenkette in Tokens umgewandelt und die Anweisung, die mir in Ordnung wäre, würde etwa so aussehen: "if token [i] ==" mailto "& & token [i + 2] ==" beispiel "dann mailAdd = token [i + 1 "] (in einer Pseudo-Code Art und Weise :))

mein Programm so weit

#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; 
} 

natürlich kann jede andere Anregung über Token wird sehr geschätzt -

+0

Token scheinen mir vernünftig. Ich weiß nicht genau, welches Problem Sie haben. Warum können Sie die Token nicht extrahieren? –

+0

Hallo Jonathan. Ich kann anscheinend keine Möglichkeit finden, das Token in eine Char-Variable zu exportieren und später im Programm für andere Berechnungen zu verwenden. Habe ich einen Sinn? :) –

+0

Wenn Sie es wiederverwenden möchten, müssen Sie die 'tch' Zeichenfolge irgendwo kopieren:' tch' selbst ändert sich ständig. Beachten Sie, dass 'strtok' die ursprüngliche Zeichenfolge ändert. Nach deiner Schleife (wenn ich die Berechnungen nicht durcheinandergebracht habe) zeigt "str + 0" auf "blahblah"; 'str + 9' ​​zeigt auf" mailto "; 'str + 16' zeigt auf" agent007 "; und "str + 25" verweist auf "example.org> blahblahblah". – pmg

Antwort

2

Mein erster Gedanke war, Verwenden Sie strstr für "mailto:" und strchr für das "@"

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

Natürlich ist das ein sehr grober Entwurf. Es braucht viel Raffinierung (Ausfall der "mailto:" zu finden String oder '@' Zeichen, Fehlerprüfung, Sonderfälle, Tests, ...)


Speichern der strtok Zeiger

#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

Gutes Denken @pmg! :-) –

+0

Nun, ich sehe, was du da gemacht hast :) Getestet und funktioniert wie ein Zauber. Danke eine zillion pmg :) –

1

Sie könnten strstr verwenden, um nach 'mailto:' zu suchen und dann strchr, um nach '@' zu suchen und die Zeichen dazwischen zu nehmen. Ich benutze nie strtok, aber ich sehe nicht, was mit dem, was Sie getan haben, falsch ist.

Hier ist ein Beispiel, in dem email auf "Agent007" in Ihrem Fall zeigen sollte. Fehlerbehandlung fehlt hier. Dies ist destruktiv, dh es ändert die Eingabezeichenfolge, aber auch strtok.

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

+1 'strtok' sucks :) – pmg

+0

Das ist aber das Problem, das ich gegenüberstehen. :) Wie kann ich diese Charaktere nehmen? –