這是我的一點點修改的功能從C++(它使用std::string
和std::vector
有),所以我對於可能出現的錯誤後悔,但這裏有一個split
功能使用strtok
,您可以使用:
int split(char *results, int resultsDim, char* toSplit, const char *delims){
char *tmpString;
int beginning = 0;
int num = 0, i=0;
int len = strlen(toSplit);
for (tmpString = strtok(toSplit, delims), i=0;
tmpString != NULL; tmpString = strtok(NULL, delims), ++i){
strncpy((results+(num++)*resultsDim), tmpString, strlen(tmpString));
(results+(num-1)*resultsDim)[i-beginning] = 0;
beginning = i+1;
}
if (beginning != len){
strncpy((results+(num++)*resultsDim), tmpString, strlen(tmpString));
(results+(num-1)*resultsDim)[len-beginning] = 0;
}
return num;
}
現在,你可以使用函數來獲得令牌和令牌的數量在一個單獨的字符串數組,遍歷認爲,按照一般@Joachim Pileborgs的想法,像這樣:
int main(void){
int n;
char words[20][50+1];
char flags[20] = {0};
char sentence[50*20+1];
int i, j;
printf("Get me the input: \n");
fgets(stdin, sentence, 50*20);
n = splitString((char*)words, 50+1, sentence, " .,!?");
for (i=0; i < n; ++i)
for (int j=0; j < n; ++j)
if (!strcmp(words[i], words[j]))
++flags[j];
for (i = 0; i < n; ++i){
printf("%s ", words[i]);
if (flags[i] > 1)
printf("%s ", words[i]);
}
printf("\n");
}
順便說一句,你應該注意到我用fgets
代替gets
函數在開頭輸入句子:這是因爲gets
一般被認爲是不安全。也就是說,如果輸入的字符串是,比爲字符串保留的內存長,它將繼續將數據寫入未保留的內存。相反,fgets
有一個額外的論據,說明它可以輸入的有用字符的最大數量(不包括'\0'
) - 因此,它肯定會停留在保留內存的邊界內。
你真的應該在發佈之前測試代碼。 – Armali 2014-03-11 07:40:45