如果你把它放在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
建議請看看'strdup'
strtok
完全一樣。 –「程序要求我寫一些文字」有機器終於復活?我們現在是奴隸嗎? – schil227