原始字符串被「切成片」,由strtok
操作,所以你其實可以做到以下幾點:
#include <stdio.h>
#include <string.h>
int main(void)
{
char test_string[50]="string to split up";
char *sub_string[50];
int ii = -1;
/* Extract first string */
sub_string[++ii]=strtok(test_string, " "));
printf("%s\n", sub_string[0]);
/* Extract remaining strings */
while ((sub_string[++ii]=strtok(NULL, " ")) != NULL)
{
printf("%s\n", sub_string[ii]);
}
}
基本上,strtok
插入'\0'
在發現分隔符,並返回一個指針開始的令牌。所以你實際上並不需要分配新的內存給sub_string
元素 - 僅僅是陣列。我將數組的元素數量設置爲50;在現實中,你會想要確保你運行的空間在你while
循環停止...
小圖可以幫助:
原始字符串:
s t r i n g t o s p l i t u p \0
第一次調用strtok
後:
s t r i n g \0 t o s p l i t u p \0
^ first pointer
下一個電話後:
s t r i n g \0 t o \0 s p l i t u p \0
^second pointer
第三個電話後:
s t r i n g \0 t o \0 s p l i t \0 u p \0
^third pointer
等
如果你想存儲在「不同的變量」的子串(不知道你爲什麼不考慮sub_string[0]
和sub_string[1]
等,以方便「不同的變量」,但我會離開,對於另一時間),你可以的以上更改爲:
#include <stdio.h>
#include <string.h>
int main(void)
{
char test_string[50]="string to split up";
char *string1, *string2, *string3, *string4, *string5;
int n = 0;
/* Extract first string */
if(strlen(test_string)==0) return 0;
string1=strtok(test_string, " "));
n++;
printf("%s\n", string1);
while(n < 5) {
string2 = strtok(NULL, " ");
if (string2 == NULL) break; else n++;
string3 = strtok(NULL, " ");
if (string3 == NULL) break; else n++;
string4 = strtok(NULL, " ");
if (string4 == NULL) break; else n++;
string5 = strtok(NULL, " ");
if (string4 == NULL) break; else n++;
}
printf("the total number of strings found is %d\n", n);
}
我只是覺得它不如使用char *
的數組那麼優雅。你能看到我的觀點嗎?
謝謝@弗洛里斯。這真的清除了我對strtok實際工作原理的理解。然而,我編輯了關於如何將字符串的每個部分保存爲多個字符串變量的問題,但對於我的問題我有點不清楚。
但是我有一個關於你的代碼的問題。你聲明瞭ii = -1,當它第一次被調用爲++ ii時,它的值在代碼中的那一點已經變爲0,但是當在循環中調用++ ii時,它的值不應該是1這次叫它?
P.S:我如何突出我在評論部分寫的功能? –
@ArmanIqbal - 沒問題。要突出顯示註釋中的代碼,請使用反引號括起來:'''code \''。我以'ii = -1;'開始,所以當我第一次增加它的時候它就是'0'(對於字符串數組中的第一個元素);然後我繼續增加,所以我可以使用它(增量後)打印出來。我會在更新答案時解決您的其他問題。 – Floris