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++コンパイラを使用しています。
'(* pppcToks)[(* nTkns)]にはスペースを割り当てますが、決して何もコピーしません。また、間接的なことはすべて混乱です。 'struct'を作成し、それを関数に渡すことを検討してください。 –
これは、デバッガの使用を開始するのに最適な時期です。コードをステップ実行しながら変数を観察できるときに何が起こっているのかを簡単に把握することができます。 – user694733
@ JohnnyMopp * 'struct'を作成し、それを関数に渡すことを検討してください。あるいは、何かにポインタを渡すのではなく、実際には*値を返します。 –