2017-04-25 38 views
-2

以下のコードの問題点は何ですか? 25行目で失敗します。なぜ失敗したのか理解できません。strtokは適切な呼び出しにもかかわらず失敗します

#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; 
} 

ここではstrtokの仕様が示唆するように、第一には、区切り文字列と呼ばれ、次いでNULLと、両方の場合において、最初の引数の文字列を解析します。 2回目の解析に失敗します。

どのような考えですか?

+3

であり、我々は、ライン#25を数えることになっていますか? –

答えて

2

2回目にstr = strtok(NULL、 ":")と呼びます。

2

私はあなたが間違っていると信じています。

str = strtok(tempStr, NULL); 

のような呼び出しは意味がありません、あなたはNULLとして区切り文字列へのポインタを渡しています。前と同じ文字列の解析を続けたい場合は、最初の引数をNULLとして渡す必要があります。

C11を引用し、章§7.24.5.8、(強調鉱山

char *strtok(char * restrict s1, 

CONSTチャー* S2を制限します)。

strtok()関数の呼び出しのシーケンスは、文字列がs2によって が指す文字列から文字で区切られているそれぞれのトークンの シーケンス、にs1によって指さ壊れます。 シーケンス内の最初の呼び出しでは、最初の引数がnullではありません。 シーケンスの後続の呼び出しでは、最初の引数がNULLになります。s2が指し示す区切り文字列は、コールとは異なる である場合があります。

は、たぶん、あなたが望むもの

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

ありがとうございます。はい、ちょうどそれを持っています。 – Abu

関連する問題