2016-05-08 2 views
4

下記のコードを使用すると、プログラムがクラッシュします。 this sourceからコピー&ペーストされたコードであり、まったく変更されていませんが、strtokはプログラムをクラッシュさせるようです。Cでstrtokを実行すると、異なるソースのサンプルコードをコンパイルしても私のプログラムがクラッシュする

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

int main() 
{ 
    char str[80] = "This is - www.tutorialspoint.com - website"; 
    const char s[2] = "-"; 
    char *token; 

    /* get the first token */ 
    token = strtok(str, s); 

    /* walk through other tokens */ 
    while(token != NULL) 
    { 
     printf(" %s\n", token); 

     token = strtok(NULL, s); 
    } 

    return(0); 
} 

私はこれの原因を見つけることができないようです。私はstrtok関数へのソースを探してみました、とthisに出くわしました:

char * __cdecl strtok(char *s1, const char *delimit) 
{ 
    static char *lastToken = NULL; /* UNSAFE SHARED STATE! */ 
    char *tmp; 

    /* Skip leading delimiters if new string. */ 
    if (s1 == NULL) { 
     s1 = lastToken; 
     if (s1 == NULL)   /* End of story? */ 
      return NULL; 
    } else { 
     s1 += strspn(s1, delimit); 
    } 

    /* Find end of segment */ 
    tmp = strpbrk(s1, delimit); 
    if (tmp) { 
     /* Found another delimiter, split string and save state. */ 
     *tmp = '\0'; //->This seems to be the line at fault<- 
     lastToken = tmp + 1; 
    } else { 
     /* Last segment, remember that. */ 
     lastToken = NULL; 
    } 

    return s1; 
} 

ローカルコピーを作成し、自分のコードで代わりにそれを使用して、同じ問題になった、といくつかのプリントを使用した後に思えますstrpbrkはアクセス可能な正しい値を返します(戻り値にprintfを使用することで)、値\ 0が割り当てられるとプログラムがクラッシュしますそれ以降に入力されたメッセージは印刷できません)。

私が得る限り、それは誰でも何が起こっているか考えていますか?

返信いただきありがとうございます。

+4

あなたのコードは私に似ています。あなたのコンパイラや関連するライブラリなどのインストールにバグがなければなりません。 –

+1

私はコードを試して、それは動作します。 –

+0

(先頭のデリミタを除いて、疑わしい)2番目のバージョンでは、複数の区切り文字を1つとして扱いません(strtok()と同じように)。 BTW:strtok()はひどい関数です。それを避ける方が良い。それを模倣しようとしないでください。 – wildplasser

答えて

2

code is workingをご覧ください。この問題は、ローカル環境と構成のローカルエラーである可能性があります。別のコンピュータで試してみるか、リンクをたどり、期待どおりの出力を得ることができます。あなたはValgrindなどの解析プログラムでコンパイルされたプログラムを実行する場合

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

int main() 
{ 
    char str[80] = "This is - www.tutorialspoint.com - website"; 
    const char s[2] = "-"; 
    char *token; 

    /* get the first token */ 
    token = strtok(str, s); 

    /* walk through other tokens */ 
    while(token != NULL) 
    { 
     printf(" %s\n", token); 

     token = strtok(NULL, s); 
    } 

    return(0); 
} 

あなたがクラッシュをデバッグし、どこでの素敵なエラーメッセージを取得することができ、コードやエラーから報告されたいずれかのエラーがないことがわかりますプログラムがクラッシュするコード。

関連する問題