2016-04-13 7 views
1

Ich brauche eine Zeichenfolge wie folgt zu analysieren:tokenize ein String mit einem bestimmten Multi-Byte-Begrenzer

link:a link:blink:c link:d lkjh

Der Ausgang a sein soll, blink:c, d

Aber der Ausgang mit strtok understably ist a, c, d, jh

Wie stelle ich sicher, nur link: teilt die Zeichenfolge explizit (Vermeidung der Fall von blink:c Get Split. Auch wie stelle ich sicher, dass die letzten kjh nicht erscheinen (k scheint hier das Trennzeichen zu sein).

+1

mir scheint, dass der Eingang als „link analysiert werden müssen möglicherweise: c "und nicht als" blink: c ". Sind Sie sich Ihrer Anforderungen sicher? – kaylum

+1

Ihre Anforderungen sind zumindest nicht klar. Wenn Sie wollen, einfach 'link:' um die Zeichenfolge zu teilen, dann würde 'link: b' und' link: c' zwei Token sein und sollten. Wenn andererseits "link:" (mit einem führenden Leerzeichen) die Zeichenfolge teilen soll, wäre das erste Token "link: a", da ihm das führende Leerzeichen fehlt. Sie sollten wahrscheinlich klarstellen, was Sie eigentlich wollen. – Dolda2000

+0

@ kaylum, ich bin mir sicher, es muss "blink: c" –

Antwort

4

Erstens, die Übergabe einer Trennzeichenfolge an strtok tut nicht das, was Sie zu denken scheinen. Wenn Sie "link:" als das Feld delim übergeben, wird dieser Zeichen als Trennzeichen verwendet. Deshalb wird lkjh geteilt und jh zurückgegeben.

Sie sind besser dran durch Leerzeichen spalten, und dann überprüfen Sie die ersten Übereinstimmungen "link:".

const char * delim = " "; 
const char * prefix = "link:"; 
const size_t len_prefix = strlen(prefix); 

char * token = strtok(input_string, delim); 
while(token != NULL) { 
    if(0 == strncmp(token, prefix, len_prefix) 
    { 
     printf("%s\n", token + len_prefix); 
    } 
    token = strtok(NULL, delim); 
} 

Wenn Sie etwas komplizierter, als diese benötigen, Ihre eigene Rolle oder einen regulären Ausdruck verwenden.

+0

Hallo, warum druckst du printf ("% s \ n", token + len_prefix); ? Ich verstehe nicht die Notwendigkeit, dies zu verketten. Was ich verstehe, ist, dass Sie Speicherplatz-Tokens erhalten haben, und jetzt für die ersten 5 Zeichen vergleichen, um gleich zu sein: und dann versuchen, den Rest davon zu drucken. Ist das richtig? –

+0

Das ist richtig. Der Rest des dem Präfix folgenden Strings beginnt bei 'token + len_prefix'. Das ist Zeigerarithmetik, keine Verkettung. Sie können damit machen, was Sie wollen. Kopiere es irgendwo oder was auch immer. In diesem Fall drucke ich es einfach aus. – paddy

0

Beantworten meiner eigenen Frage.

Grundsätzlich finden Sie den ersten Link: und dann weiter bis zum nächsten Leerzeichen/null, und wiederholen Sie den String Rest.

besserer Ansatz ist einfach strstr zu verwenden: -: b Link

char* parseSubFn(char *string) 

{

if(string==NULL || *string=='\0') 
    return; 

    else{ 
    //printf("Parsing on %s \n",string); 
    const char* needle = "link:"; 
    char ret[128];//large buffer character for return token 
    char *location=strstr(string,needle); 
    char *start=location+5; 
    int i=0; 
    while(*start!='\0' && *start!='\n' && *start!=' ') 
    { 
    ret[i]=*start; 
    start++;i++; 
    } 
    start++; 
    printf("%s\n",ret); 
    parseSubFn(start); 
    } 

}

Verwandte Themen