2014-10-27 24 views
7

Ich habe Probleme mit der Aufteilung einer Zeichenfolge. Der folgende Code funktioniert, aber nur wenn zwischen Strings '' (Leerzeichen) sind. Aber ich muss Strings teilen, auch wenn es Whitespace Char gibt. Ist strtok() überhaupt notwendig?Geteilte Zeichenfolge mit mehreren Trennzeichen mit Strtok in C

char input[1024]; 
char *string[3];   
int i=0; 

fgets(input,1024,stdin)!='\0')    //get input 
{           
    string[0]=strtok(input," ");    //parce first string 
    while(string[i]!=NULL)      //parce others 
    { 
    printf("string [%d]=%s\n",i,string[i]); 
    i++; 
    string[i]=strtok(NULL," "); 
    } 
+1

Das Argument 'strtok' können so viele Separatoren, wie Sie wollen enthalten. – usr2564301

+1

i. e., 'strtok (Eingabe," \ t \ r \ n \ f \ v ");' und 'strtok (NULL, \ t \ r \ n \ f \ v"); '. –

+1

Und Ihre 'fgets()' Aussage sieht nicht richtig aus (fehlt ein ';' auch). Wenn es Teil einer Schleife ist, können Sie nicht mit "\ 0" für einen Fehler vergleichen. –

Antwort

6

Ein einfaches Beispiel, das zeigt, wie Sie mehrere Begrenzer und mögliche Verbesserungen in Ihrem Code verwenden. Siehe eingebettete Kommentare für Erklärungen.

Sie sich über die allgemeinen Mängel der strtok() (aus Handbuch) gewarnt:

Diese Funktionen ihr erstes Argument ändern.

Diese Funktionen können nicht für konstante Strings verwendet werden.

Die Identität des Begrenzungsbytes ist verloren gegangen.

Die strtok() Funktion verwendet einen statischen Puffer beim Parsen, also ist es nicht Thread sicher. Verwenden Sie strtok_r(), wenn dies für Sie von Bedeutung ist.


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

int main(void) 
{  
    char input[1024]; 
    char *string[256];   // 1) 3 is dangerously small,256 can hold a while;-) 
           // You may want to dynamically allocate the pointers 
           // in a general, robust case. 
    char delimit[]=" \t\r\n\v\f"; // 2) POSIX whitespace characters 
    int i = 0, j = 0; 

    if(fgets(input, sizeof input, stdin)) // 3) fgets() returns NULL on error. 
             // 4) Better practice to use sizeof 
             // input rather hard-coding size 
    {           
    string[i]=strtok(input,delimit); // 5) Make use of i to be explicit 
    while(string[i]!=NULL)      
    { 
     printf("string [%d]=%s\n",i,string[i]); 
     i++; 
     string[i]=strtok(NULL,delimit); 
    } 

    for (j=0;j<i;j++) 
    printf("%s", string[i]); 
    } 

    return 0; 
} 
Verwandte Themen