2017-09-12 8 views
0

strtokを使用してトークンを分割しようとすると、コードがクラッシュする。ここに私のコードです:文字列を関数に渡してstrtokを使用してトークンを分割するとコードがクラッシュする

#define MAX_STRING_SIZE 256 

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

static void getTokens(char *s1 ,char *ct1 ,char ***pppcToks ,int *nTkns) 
{ 
    char *s2 = NULL; 
    char *cp = NULL; 

    cp = strtok(s1, ct1); 
    (*nTkns)++; 

    *pppcToks = (char **) malloc(1 * sizeof(char *)); 
    (*pppcToks)[0] = (char *)malloc(MAX_STRING_SIZE * sizeof(char)); 
    (*pppcToks)[0] = cp; 

    while (NULL != (cp = strtok(NULL, ct1))) 
    { 

     *pppcToks = (char **)realloc((void *)(*pppcToks), (*nTkns) * sizeof(char *)); 
     (*pppcToks)[(*nTkns)] = (char *)malloc(MAX_STRING_SIZE * sizeof(char)); 
     (*pppcToks)[(*nTkns)] = cp; 
     printf("%s\n", (*pppcToks)[(*nTkns)]); 
     (*nTkns)++; 
    } 
    printf("%d", *nTkns); 

} 

int main(int argc, char *argv[]) 
{ 
    char ac[MAX_STRING_SIZE] = "Strtok#should#be tested to an extent"; 
    int nTkns = 0,inx; 

    char **ppcList = NULL; 


    getTokens(ac, "#", &ppcList, &nTkns); 

    for (inx =0; inx < nTkns; inx++) 
    { 
    printf("%s", ppcList[inx]); //Fails in second loop 
    } 
    for(;;); 

} 

最初のトークンが印刷されます。さらに印刷するとクラッシュが発生します。また、CコードをコンパイルするためにC++コンパイラを使用していますので、C++コンパイラを使用しています。

+2

'(* pppcToks)[(* nTkns)]にはスペースを割り当てますが、決して何もコピーしません。また、間接的なことはすべて混乱です。 'struct'を作成し、それを関数に渡すことを検討してください。 –

+2

これは、デバッガの使用を開始するのに最適な時期です。コードをステップ実行しながら変数を観察できるときに何が起こっているのかを簡単に把握することができます。 – user694733

+1

@ JohnnyMopp * 'struct'を作成し、それを関数に渡すことを検討してください。あるいは、何かにポインタを渡すのではなく、実際には*値を返します。 –

答えて

0

作業コードを見つけてください:すべてのあなたの貴重な提案を

#define MAX_STRING_SIZE 256 

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

static void getTokens(char *s1 ,char *ct1 ,char ***pppcToks ,int *nTkns) 
{ 
    char *cp = NULL; 

    /* get the first token */ 
    cp = strtok(s1, ct1); 
    (*nTkns)++; 

    (*pppcToks) = (char **) malloc(1 * sizeof(char *)); 
    (*pppcToks)[0] = (char *)malloc((strlen(cp) + 1) * sizeof(char)); 
    strcpy((*pppcToks)[0], cp); 

    /* walk through other tokens */ 
    while (NULL != (cp = strtok(NULL, ct1))) 
    { 
     (*nTkns)++; 
     (*pppcToks) = (char **)realloc((void *)(*pppcToks), (*nTkns) * sizeof(char *)); 
     (*pppcToks)[*nTkns-1] = (char *)malloc((strlen(cp) + 1) * sizeof(char)); 
     strcpy((*pppcToks)[*nTkns-1], cp); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    char ac[MAX_STRING_SIZE] = "Strtok#should#be tested to an extent"; 
    int nTkns = 0,i; 

    char **ppcList = NULL; 


    getTokens(ac, "#", &ppcList, &nTkns); 

    for (i =0; i < nTkns; i++) 
    { 
    printf("%s\n", ppcList[i]); 
    } 
    for(;;); 

} 

感謝を!

+0

それはまだ正しくありません。あなたは 'malloc'で文字列をコピーするためのスペースを割り当てますが、ポインタを'(* pppcToks)[0] = cp'で再割り当てします。これで 'malloc'(mem leak)によって返されたmemを失ってしまいました。代わりに 'strcpy((* pppcToks)[0]、cp)'を使う必要があります。 –

+0

@Johnny Moppコメントをいただきありがとうございました! – jeja

関連する問題