2011-03-09 71 views
1

我解決下的問題,在那裏我找到ASTRING重複的話就像如何檢查C中字符串中的重複單詞?

char a[]="This is it This"; 

在上面的字符串「這」出現兩次,所以我想指望它作爲一個。

任何人都可以建議如何實現這一目標嗎?

+2

這功課嗎?看看strtok(用於分解字符串)和strcmp來檢查strtok中每個標記是否存在重複。您也可以一次移動一個字節的字符串,使用strcmp和指針操作來查找搜索字符串。有很多方法來剝皮這隻貓。 – jmq 2011-03-09 07:02:11

+0

不準確的家庭作業.. @Jmquigley,我不必使用標準的字符串函數做 – 2011-03-09 07:04:17

+0

「count as one」是什麼意思?你想第二個被刪除?指向第二個事件的指針?需要更多的信息。 – jmq 2011-03-09 07:06:38

回答

1

這是一個程序,可以完成你所要求的功能。它被硬編碼爲最多99個字符的4個字。這可以很容易地改變;我只是適合你的輸入。我也用strcmpstrcpy。這兩個函數都可以自己實現(稱它們爲mystrcpy和mystrcmp並嵌入它們)。我不會爲你重寫字符串函數。我確實展示瞭如何根據其他答案來避免strtok。我查看了他們,他們並不複雜,但他們沒有添加任何東西到程序中,我不想重新發明輪子。最後,我只是在notInArray函數中使用了一個簡單的線性搜索。對於大型數據集來說,這並不高效(您可能會使用某種類型的樹或散列)。

這是gcc版本下編譯4.3.4

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

int notInArray(char arr[][100], char *word, int size); 

int main() { 
    char a[] = "This is a This"; 
    char *ptr; 
    char strarr[4][100]; 
    char word[100]; 
    int pos = 0; 
    int count = 0; 
    int i; 

    memset(&strarr,0,sizeof(strarr)); 
    printf("%s\n\n",a); 

    ptr = a; 
    while (*ptr) { 

    sscanf(ptr, "%s ", word); 
    if (notInArray(strarr,word,4)) { 
     strcpy(strarr[pos++],word); 
     printf("%s\n", word); 
    } 

    while (!isspace(*ptr++) && *ptr) {} 
    } 

    for (i=0; i<4; i++) { 
    if (*strarr[i]) { 
     printf("strarr[%d]=%s\n",i, strarr[i]); 
     count++; 
    } 
    } 

    printf("\nUnique wordcount = %d\n", count); 

    return(0); 
} 

int notInArray(char arr[][100], char *word, int size) { 
    int i; 

    for (i=0; i<size; i++) { 
    if (*arr[i] && !strcmp(arr[i],word)) { 
     return(0); 
    } 
    } 

    return(1); 
} 

輸出看起來像:

~>a 
This is a This 

This 
is 
a 
strarr[0]=This 
strarr[1]=is 
strarr[2]=a 

Unique wordcount = 3 

享受。

+0

感謝您的努力,想知道寫上面的代碼花了多少錢? – 2011-03-09 10:07:14

+0

這個程序並不難寫。我不得不查找sscanf,因爲我沒有使用它,它不是寫這種類型的解析代碼的更「正常」的方式。 strtok函數通常是更好的選擇。 – jmq 2011-03-09 10:17:13

+0

無論如何感謝@jmquigley爲你的幫助,並試圖讓它更容易一點... – 2011-03-09 10:35:25

0

我可能會一次讀一個單詞(例如,使用sscanf [編輯:剛剛看到您的評論 - 它仍然很容易沒有字符串函數 - 只需掃描以找到空間/非空間字符來查找單詞 - 令人討厭但不是主要的),並把它們放入一個數組(或者,如果你有比上面顯示的多得多的二叉搜索樹)。

如果您想要計算每個單詞出現的次數,您可以在每個節點中都有一個int(或其他)。如果您只想知道輸入中的獨特單詞,則不需要計數,只需要一組單詞。

相關問題