2011-11-08 67 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

另一個問題是,你沒有爲你的字符指針數組分配內存(所以這些指針指向什麼都沒有)。

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

Yeap,這個伎倆!謝謝! –

+0

+1:你打敗了我 –

1

看一看the example in the docs

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

...其中...

STR - C字符串截斷。該字符串的內容被修改並分解成更小的字符串(標記)。可選地,可以指定一個空指針,在這種情況下,該函數繼續掃描以前成功調用函數的地方結束。

分隔符 - 包含分隔符的C字符串。 這些可能因呼叫而異。

返回值 - 指向在字符串中找到的最後一個標記的指針。 如果沒有剩餘的令牌可供檢索,則返回空指針。

你需要第一個字符串給我可以修改,你需要爲輸出分配內存,例如,

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; 
} 
相關問題