2011-11-08 44 views
7

文章を分解し、各文字列を配列に格納したいと考えています。ここに私のコードです:文字列を分割して配列に格納する

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

int main(void) 
{ 
    int i = 0; 
    char* strArray[40]; 
    char* writablestring= "The C Programming Language"; 
    char *token = strtok(writablestring, " "); 


    while(token != NULL) 
    { 
     strcpy(strArray[i], token); 
     printf("[%s]\n", token); 
     token = strtok(NULL, " "); 
     i++; 
    } 
    return 0; 
} 

それは私に分割エラーを与え続け、私はそれを把握することはできません。私はそれが私の配列にトークンをコピーするときに何かする必要があると信じています。

答えて

12

writablestringは書き込み可能ではないためです。文字列リテラルへの書き込みは未定義の動作で、strtokに書き込みます。(正しいのは、strtokが引数を変更します)。

、それを動作させるしようとする:

char writablestring[] = "The C Programming Language"; 

C FAQもあります。

もう1つの問題は、文字ポインタの配列にメモリを割り当てなかったことです(ポインタは何も指していないので)。

char* strArray[40]; /* Array of 40 char pointers, pointing to nothing. */ 

多分これを試してみてください。

/* Careful, strdup is nonstandard. */ 
strArray[i] = strdup(token); 

/* Or this. */ 
strArray[i] = malloc(strlen(token) + 1); 
strcpy(strArray[i], token); 
+0

これはトリックでした!ありがとう! –

+0

+1:あなたは私にそれを打つ –

1

the example in the docsを見てください:

char * strtok (char * str, const char * delimiters); 

... ...

STR - 切り捨てる C文字列。この文字列の内容は変更され、小さな文字列(トークン)に分割されます。 代わりに、ヌルポインターを指定することができます。この場合、関数は前回成功した呼び出しが終了した場所をスキャンし続けます。

区切り文字 - 区切り文字を含むC文字列。 これらは、コールごとに異なる場合があります。

戻り値 - stringで最後に検出されたトークンを指すポインタ。 取り出すトークンが残っていない場合は、NULLポインタが返されます。

最初の文字列を変更する必要があります。出力にメモリを割り当てる必要があります。

int main(void) 
{ 
    int i = 0; 
    const int numOfStrings = 128; 
    char* strArray[numOfStrings]; 
    char writablestring[]= "The C Programming Language"; 
    char *token = strtok(writablestring, " "); 

    for(int j = 0; j < numOfStrings; j++) 
    { 
     strArray[j] = new char[40]; 
    } 

    while(token != NULL) 
    { 
     strcpy(strArray[i], token); 
     printf("[%s]\n", token); 
     token = strtok(NULL, " "); 
     i++; 
    } 
    return 0; 
} 
関連する問題