2016-11-17 67 views
1

因此,假設我有一個數組(程序要求我寫一些文字):如何將每個句子作爲數組的一個元素存儲?

char sentences[] = "The first sentence.The second sentence.The third sentence"; 

,我需要每個句子存儲爲一個數組,在那裏我可以訪問任何字,或存儲單個數組中的句子作爲元素。 (句子[0] = 「第一句」 判決[1] = 「第二句」;)

如何單獨打印出每個句子我知道:

char* sentence_1 = strtok(sentences, "."); 
char* sentence_2 = strtok(NULL, "."); 
char* sentence_3 = strtok(NULL, "."); 

printf("#1 %s\n", sentence_1); 
printf("#2 %s\n", sentence_2); 
printf("#3 %s\n", sentence_3); 

但如何讓程序將這些句子存儲在1或3個數組中我不知道。 請幫忙!

+0

建議請看看'strdup' strtok完全一樣。 –

+0

「程序要求我寫一些文字」有機器終於復活?我們現在是奴隸嗎? – schil227

回答

3

如果你把它放在main,因爲你的sentences內存是靜態的(不能被刪除),你可以簡單地這樣做:

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

int main() 
{ 
    char sentences[] = "The first sentence.The second sentence.The third sentence"; 
    char* sentence[3]; 
    unsigned int i; 

    sentence[0] = strtok(sentences, "."); 

    for (i=1;i<sizeof(sentence)/sizeof(sentence[0]);i++) 
    { 
    sentence[i] = strtok(NULL, "."); 
    } 

    for (i=0;i<sizeof(sentence)/sizeof(sentence[0]);i++) 
    { 
    printf("%d: %s\n",i,sentence[i]); 
    } 

    return 0; 

} 

在一般情況下,你首先要複製您的輸入字符串:

char *sentences_dup = strdup(sentences); 
sentence[0] = strtok(sentences_dup, "."); 

很多原因:

  • 你不知道的輸入的壽命/範圍,它通常是一個指針/參數,所以你的句子可能是無效的,因爲一旦輸入內存被釋放/超出範圍
  • 傳遞的緩衝區可能const:你不能修改其內存(strtok修改傳遞的緩衝區)
  • 更改sentences[]通過*sentences在上面的示例中,並且您指向一個只讀區域:您必須複製緩衝區。

不要忘記存儲重複的指針,因爲您可能需要在某個時候釋放它。 另一種方法是重複的也有:

for (i=1;i<sizeof(sentence)/sizeof(sentence[0]);i++) 
    { 
    sentence[i] = strdup(strtok(NULL, ".")); 
    } 

這樣你就可以立刻釋放你的大標記化的字符串,句子有自己的,獨立的內存。

編輯:這裏剩下的問題是,你還必須提前知道有多少句子中有你的輸入。

對於這一點,你可以指望的點,然後分配指針的適當數量。

int j,nb_dots=0; 
char pathsep = '.'; 
int nb_sentences; 
int len = strlen(sentences); 
char** sentence; 

// first count how many dots we have 
for (j=0;j<len;j++) 
{ 
    if (sentences[j]==pathsep) 
    { 
     nb_dots++; 
    }  
} 
nb_sentences = nb_dots+1; // one more!! 
// allocate the array of strings 
sentence=malloc((nb_sentences) * sizeof(*sentence)); 

現在我們有了字符串的數量,我們可以執行我們的strtok循環。只是要小心使用nb_sentences,而不是sizeof(sentence)/sizeof(sentence[0])現在是不相關的(價值1),因爲數組類型的變化的。

但在這一點上,你也可以擺脫在另一answer of mine