2014-09-25 78 views
0

我有以下代碼,它檢查一行。統計一些單詞並計算每個單詞出現的頻率。基本上,我想添加一個計數器,以便對於每個單詞(由getNextWord獲取),它將在struct word_t中將該單詞的數量記錄爲wordCount(例如,如果該行是「all,cats!very very遠」,我需要它來記錄0所有,1只貓,2游泳等),這是我工作的功能:試圖找到一行內的單詞索引(以單詞數量度量)

void 
func4(line_t * linePtr, int argnum, char * argval[]) { 

    int getfrequency(line_t* linePtr, char* checkword); 
    word_t word; 
    int Size; 
    int i; 
    int k=0; 
    int wordfound[MAX_QUERYLENGTH]; /* 1 if query term matches word in line */ 
    for(i = 1; i < argnum; i++,k++) { 
     int freq = 0; 
     int offsetval = 0; 
     int* offset = &offsetval; 
     wordfound[i] = 0; 


     if (wordfound[i] == 1) { 
      freq = getfrequency(linePtr, argval[i]);    
      /* this is where I require access to the index */ 
     } 
    }     
} 

我的結構在這裏被定義。請注意,stopIndex和startIndex是以字符度量的。我正在尋找的指數(以字數衡量)將被稱爲wordCount(下面列出)。

typedef struct word_t { 
    int startIndex; 
    int stopIndex; 
    int wordCount; 
    int frequency; 
    char buf[MAX_LINELEN]; 
    int wordSz; /* szie of word*/ 
} word_t; 

僅供參考,我會在這裏把函數調用太: 而(!-1 =(line.lineLength =函數getline((字符**)& line.buf,& maxSz,標準輸入))) { /*更多代碼在這裏! */ stage4(& line,argc,argv,& word); }

我試圖在getNextWord調用後添加word.wordCount ++,但是這並不起作用(甚至在函數調用的while循環中初始化爲0之後)。我也一直試圖使用wordPtr-> wordCount,但沒有得到我想要的。

謝謝。

進一步說明: 我正在採取命令行參數,其中argv是argval。這些構成查詢條款。然後,我逐行搜索文本(標準輸入)查詢條件。頻率是與查詢詞相匹配的詞出現在文本的一行中的頻率(例如,如果查詢詞是「貓帽子墊子」並且標準輸入的第一行是「貓貓貓坐的那個」,那麼貓的頻率將是3)。

我需要的是獲取標準輸入的每一行,併爲匹配查詢項的每個單詞記錄單詞編號(wordCount)(匹配使用strncasecmp確定)。也就是說,如果查詢是「貓帽墊」,並且stdin的第一行是「貓貓貓坐席」,我需要記錄第一個貓在wordCount = 0,第二個貓在wordCount = 1,第三隻貓在wordCount = 2,mat在wordCount = 4。我只需要一種方法將這些wordCounts中的每一個存儲在我的結構中,以供以後訪問。

+1

你程序和問題描述有些混亂。你從'stdin'中讀取行,但也看看參數。你是否需要單詞的頻率只是作爲參數傳遞的單詞?您可能想要澄清您的程序如何與示例調用,行輸入和預期輸出結合使用。這也有助於獲得您定義的各種類型的定義。 – 2014-09-25 06:35:44

+0

嘿,感謝您的反饋!我將編輯帖子,並會對發生的事情發表評論。 – KittiCat 2014-09-25 06:36:46

+1

至於索引:我認爲你可以在循環中保持一個位置,在這個循環中你調用'getNextWord'並重新定義'wordfound'的含義:如果找不到該單詞,並且索引if它被找到了。 – 2014-09-25 06:37:59

回答

1

我會對此有點不同。您可以在單個循環中獲取單詞的頻率和首次出現的次數。我也會交換內部和外部的循環,所以你不必再一次將循環標記爲循環。

使用每個單詞的計數器跟蹤單詞索引。同樣保持一個頻率數組。

void stage4(line_t * linePtr, int argnum, char * argval[]) 
{ 
    word_t word; 
    int wordindex[MAX_QUERYLENGTH]; /* First index in this line or -1 if none */ 
    int freq[MAX_QUERYLENGTH];   /* Frequency in this line */ 
    int count = 0;      /* Word counter */ 

    int offsetval = 0; 
    int* offset = &offsetval; 
    int i;  

    /* Initialise */ 
    for(i = 1; i < argnum; i++) { 
     wordindex[i] = -1; 
     freq[i] = 0; 
    } 

    word = getNextWord(linePtr->buf, linePtr->lineLength, offset, &word); 

    while (0 != word.stopIndex) {   
     for(i = 1; i < argnum; i++,k++) { 
      if (0 == strcasecmp(argval[i], word.buf)) { 
       /* Found a word, update frequency and pos */ 
       if (freq[i] == 0) wordindex[i] = count; 
       freq[i]++; 

       /* Assuming argval is unique, there are no further hits */ 
       break; 
      } 
     }     

     /* Update word count and read next word */ 
     count++; 
     word = getNextWord(linePtr->buf, linePtr->lineLength, offset, &word); 
    }  

    /* Print frequencies */  
    for(i = 1; i < argnum; i++) { 
     if (wordindex[i] >= 0) printf("%s: %d\n", argval[i], freq[i]); 
    } 
} 

此代碼未經過測試,因爲我沒有訪問您的(相當複雜的)閱讀功能。它也不能解決如何存儲本地頻率和位置以供進一步使用。但它應該給你一個普遍的想法如何去解決這個問題。

(用於字索引-1是多餘的在這裏,因爲不存在字的已經被一個零頻率表示,但如果頻率的累計值超過所有行也可能被使用。)

+0

我很抱歉。整個事情現在非常複雜。我非常感謝你的幫助,謝謝。整個事情起作用,除非索引總是0(我承認,幾乎肯定是由於我的複雜功能和事實,你不能訪問它)。我仍然不是100%,我理解如何自己計算指數或者對不起 – KittiCat 2014-09-25 07:44:47

+0

好吧,我忘記了更新'count',對此抱歉。我將編輯帖子。 – 2014-09-25 07:49:52