2017-02-18 2 views
0

Ich benutze die Funktion strtok(), um eine Zeichenkette in Token aufzuteilen. Das Problem liegt vor, wenn es zwei Begrenzer in der Zeile gibt.Zeichenfolge in Token in C aufteilen, wenn zwei Begrenzer in einer Zeile vorhanden sind

/* strtok example */ 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[] ="Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,,"; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str,", "); 
    while (pch != NULL) 
    { 
    printf ("Token = %s\n",pch); 
    pch = strtok (NULL, ", "); 
    } 
    return 0; 
} 

und Ausgänge:

Splitting string "Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,," into tokens: 
Token = Test= 
Token = 0.28 
Token = 0.0 
Token = 1 
Token = 1.9 
Token = 2.2 
Token = 1.0 
Token = 8 
Token = 4 
Token = 42 

Es gibt einige einfache Möglichkeit, alle Token bekommen, ich muss wissen, ob es etwas in Begrenzungszeichen ist Ursache gibt es Zeiten, die ich bekommen ,, oder, xxx,

Vielen Dank.

+1

Wenn Sie auf einem System sind, das ['strsep'] hat (http://man7.org/linux/man-pages/man3/strsep.3.html), können Sie es stattdessen verwenden. –

+0

Sie könnten [Ich brauche eine Mischung aus 'strtok()' und 'strtok_single()'] (http://stackoverflow.com/questions/30294129/i-need-a-mix-of-strtok-and- strtok-single) auch für Ideen. Es gibt viele Fragen von dort, die auch helfen könnten. Du bist nicht der erste, der solche Probleme hat. –

Antwort

0

strtok() tut explizit das Gegenteil von dem, was Sie wollen.

in einem Online-Handbuch:

Eine Folge von zwei oder mehr zusammenhängenden Delimiter-Bytes in der geparsten Zeichenfolge wird als ein einzelne Trennzeichen sein. Delimiter-Bytes am Anfang oder Ende der Zeichenfolge werden ignoriert. Anders ausgedrückt: Die Token , die von strtok() zurückgegeben werden, sind immer nicht leere Strings.

strtok(3) - Linux man page

I umgesetzt strtoke() - eine Variante von strtok(), die ähnlich verhält, aber das tut, was Sie wollen:

/* strtoke example */ 
#include <stdio.h> 
#include <string.h> 

/* behaves like strtok() except that it returns empty tokens also 
*/ 
char* strtoke(char *str, const char *delim) 
{ 
    static char *start = NULL; /* stores string str for consecutive calls */ 
    char *token = NULL; /* found token */ 
    /* assign new start in case */ 
    if (str) start = str; 
    /* check whether text to parse left */ 
    if (!start) return NULL; 
    /* remember current start as found token */ 
    token = start; 
    /* find next occurrence of delim */ 
    start = strpbrk(start, delim); 
    /* replace delim with terminator and move start to follower */ 
    if (start) *start++ = '\0'; 
    /* done */ 
    return token; 
} 

int main() 
{ 
    char str[] ="Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,,"; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtoke(str,", "); 
    while (pch != NULL) 
    { 
    printf ("Token = %s\n",pch); 
    pch = strtoke(NULL, ", "); 
    } 
    return 0; 
} 

Zusammengestellt und mit gcc auf Cygwin getestet:

$ gcc -o test-strtok test-strtok.c 

$ ./test-strtok.exe 
Splitting string "Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,," into tokens: 
Token = Test= 
Token = 0.28 
Token = 0.0 
Token = 1 
Token = 
Token = 1.9 
Token = 2.2 
Token = 1.0 
Token = 
Token = 8 
Token = 4 
Token = 
Token = 
Token = 42 
Token = 
Token = 

Eine andere Quelle aus dem obigen Link:

Vorsicht bei der Verwendung dieser Funktionen. Wenn Sie sie verwenden, beachten Sie Folgendes:

  • Diese Funktionen ändern ihr erstes Argument.
  • Diese Funktionen können nicht für konstante Strings verwendet werden.
  • Die Identität des begrenzenden Bytes ist verloren gegangen.
  • Die Funktion strtok() verwendet beim Parsen einen statischen Puffer, sodass sie nicht threadsicher ist. Verwenden Sie strtok_r(), wenn dies für Sie von Bedeutung ist.

Diese Fragen beziehen sich auf meine strtoke() auch.

Verwandte Themen