2013-11-01 8 views
8

Meine Zeichenfolge „A, B, C, D, E“
Und der Separator „“
Wie kann ich die restliche Zeichenfolge erhalten einmal strtok() nach tun, das heißt "B, C, D, E"C Sprache: Wie die verbleibende Zeichenfolge erhalten nach der Verwendung von strtok() einmal

char a[] = "A,B,C,D,E"; 
char * separator = ","; 
char * b = strtok(a,separator); 
printf("a: %s\n", a); 
printf("b: %s\n", b); 

die Ausgabe lautet:
a: A
b: A

Aber wie das Ergebnis zu erhalten
a: B, C, D, E
b: A

Danke.

+0

Denken Sie nicht 'strtok()' tut das. – Rohan

Antwort

7

Verwenden Sie nicht strtok() für dies, da das nicht wofür ist.

Verwenden strchr() den ersten Separator zu finden, und gehen von dort aus:

char a[] = "A,B,C,D,E"; 
const char separator = ','; 
char * const sep_at = strchr(a, separator); 
if(sep_at != NULL) 
{ 
    *sep_at = '\0'; /* overwrite first separator, creating two strings. */ 
    printf("first part: '%s'\nsecond part: '%s'\n", a, sep_at + 1); 
} 
+0

Sehr cleaver Lösung! –

1

Versuchen Sie folgendes:

char a[] = "A,B,C,D,E"; 
char * end_of_a = a + strlen(a); /* Memorise the end of s. */ 
char * separator = ","; 
char * b = strtok(a, separator); 
printf("a: %s\n", a); 
printf("b: %s\n", b); 

/* There might be some more tokenising here, assigning its result to b. */ 

if (NULL != b) 
{ 
    b = strtok(NULL, separator); 
} 

if (NULL != b) 
{ /* Get reference to and print remainder: */ 
    char * end_of_b = b + strlen(b); 

    if (end_of_b != end_of_a) /* Test whether there really needs to be something, 
         will say tokenising did not already reached the end of a, 
         which however is not the case for this example. */ 
    { 
    char * remainder = end_of_b + 1; 
    printf("remainder: `%s`\n", remainder); 
    } 
} 
0

Wenn strtok Verwendung nicht erforderlich ist, können Sie strchr statt, da die Trennzeichen verwenden ist ein einzelnes Zeichen:

char a[] = "A,B,C,D,E"; 
char *sep = strchr(a, ','); 
*sep = '\0'; 
puts(a); 
puts(sep + 1); 
0

printf ("a:% s \ n", a + 1 + str (b));

Versuchen Sie, diese

+0

Bitte lesen Sie * larsmans * Kommentare zu * dasblinkenlight * 's Antwort zu diesem Ansatz. Es gilt auch für Ihre Antwort. – alk

0

strtok die letzte Saite erinnert sich mit ihm gearbeitet und wo es endete. Um die nächste Zeichenfolge zu erhalten, rufen Sie sie erneut mit NULL als erstes Argument auf.

char a[] = "A,B,C,D,E"; 
const char *separator = ","; 
char *b = strtok(a, separator); 
while (b) { 
    printf("element: %s\n", b); 
    b = strtok(NULL, separator); 
} 

Hinweis: Dies ist nicht threadsicher.

15

Sie den Satz von Begrenzungszeichen variieren kann, so einfach einen leeren String:

char a[] = "A,B,C,D,E"; 
char * separator = ","; 
char * b = strtok(a, separator); 
printf("b: %s\n", b); 
char * c = strtok(NULL, ""); 
printf("c: %s\n", c); 
+1

** Passing kein Begrenzer ist der Weg zu gehen! ** In meinem Fall habe ich 'strtok' mehr als einmal verwendet, und irgendwann brauchte ich den Rest. So ** nicht ** mit 'strtok' war keine Lösung. Weder Summieren von Zeichen, weil ich im Raum "token", und es könnte eine variable Anzahl von aufeinander folgenden Leerzeichen enthalten, usw. – Paschalis

Verwandte Themen