2017-04-25 3 views
-2

Worin besteht das Problem mit dem folgenden Codefragment? es schlägt in Zeile 25 fehl. Ich verstehe nicht, warum es scheitert.STRTOK schlägt trotz ordnungsgemäßem Aufruf fehl

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

char linebuf[1024]="SET SLMSRVR 10.133.2.102: 50011"; 
char *tempStr; 
char *str; 

int main() 
{ 
    tempStr = calloc(1024, sizeof(char)); 

    strcpy(tempStr, linebuf+strlen("SET SLMSRVR")); 
    printf("1 tempStr: %s\r\n", tempStr); 

    str = strtok(tempStr, ":"); 
    printf("2 tempStr: %s\tstr: %s\r\n", tempStr, str); 

    if (str != NULL){ 
     printf("Server IP: %s\r\n",str); 
    } else { 
     printf("Error 1\r\n"); 
    } 

    str = strtok(tempStr, NULL); 
    printf("3 tempStr: %s\tstr: %s\r\n", tempStr, str); 
    if (str != NULL) { 
     printf("Port: %s\r\n", str); 
    } 

    return 0; 
} 

Hier wie die Spezifikation von strtok schlägt vor, zuerst wird es mit Trennzeichenfolge genannt und dann mit NULL, erste Argument in beiden Fällen die Zeichenfolge analysiert werden. Es kann nicht zum zweiten Mal analysiert werden.

Irgendwelche Gedanken?

+3

Und wir sollen Linie 25 # zählen? –

Antwort

2

Das zweite Mal sollten Sie es als str = strtok (NULL, ":");

2

Ich glaube, Sie haben es falsch verstanden. Ein Anruf wie

str = strtok(tempStr, NULL); 

macht keinen Sinn, Sie vorbei den Zeiger auf Trennzeichenfolge als NULL. Wenn Sie die gleiche Zeichenfolge wie zuvor weiter analysieren möchten, müssen Sie das erste Argument als NULL übergeben.

Zitiert C11, Kapitel §7.24.5.8, (emphasis Mine)

char *strtok(char * restrict s1, 

const char * s2 beschränken);

Eine Sequenz von Aufrufen der Funktion strtok() bricht der Zeichenfolge durch s1 in eine Folge von Token hingewiesen, von denen jede durch ein Zeichen begrenzt wird von der Schnur auf von s2 spitz. Der erste Aufruf in der Sequenz hat ein erstes Argument ungleich null. nachfolgende Aufrufe in der Sequenz haben ein Null-Argument. Die Trennzeichenfolge, auf die s2 zeigt, kann sein, die sich von Call to Call unterscheidet.

Vielleicht, was Sie wollen, ist

str = strtok(NULL, ":"); //or some other delimiter 
+0

Danke. Ja, habe es gerade. – Abu

Verwandte Themen