2017-03-09 58 views
0

我想確定在命令行參數中傳遞的單詞的頻率,所以我用一個字符串定義了一個結構並且它是count,現在問題是當我試圖通過比較結構數組中的字符串來搜索字符串時使用strcmp()功能串,我越來越Segmentation Fault,下面的代碼: -如何搜索結構數組中的字符串?

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

typedef struct{ 
    char* word; 
    int count; 
} argsArray; 

int search(argsArray array[] , char* Word , int len){ 
    for(int i=0; i < len; i++){ 
    if(strcmp(array[i].word , Word)==0){ 
     return i; 
    } 
    } 
    return -1; 
} 

int main(int argc , char* argv[]){ 
    argsArray inputArgs[50]; 
    int i,p=0,a; 
    for(i=0;i<50;i++){ 
    inputArgs[i].word=NULL; 
    inputArgs[i].count=0; 
    } 
    for(i=1 ; i < argc ; i++){ 
    a = search(inputArgs , argv[i] , argc); 

    if( a== -1){ 
     inputArgs[p].word=argv[i]; 
     inputArgs[p].count++; 
     p++; 
    } 
    else{ 
     inputArgs[a].count++; 
    } 
    } 
    for(i = 0; i < p; i++){ 
    printf("%s %d\n",inputArgs[i].word,inputArgs[i].count); 
    } 
    return 0; 
} 

回答

2

我會建議你一些更正。

首先,我認爲你在寫這個時試圖初始化結構數組。

for(i=0;i<50;i++){ 
    inputArgs[i].word=NULL; 
    inputArgs[i].count=0; 
} 

正如在另一個答案中提到的,這將導致分段錯誤。您可以用""初始化input[i].word

或者,在search函數中,可以檢查array[i].word是否爲NULL;如果您發現NULL,那麼您立即從該函數返回-1

對於第二個建議,你的search函數會變成這樣。

int search(argsArray array[] , char* Word , int len){ 
    for(int i=0; i < len; i++){ 
    if(array[i].word == NULL) 
     return -1; 
    if(strcmp(array[i].word , Word)==0){ 
     return i; 
    } 
    } 
    return -1; 
} 

Reference for second suggestion

+0

感謝名單,它的工作:) –

+0

不客氣。 – Muntasir

0

inputArgs[i].word=NULL;然後search(inputArgs , argv[i] , argc);它調用strcmp(array[i].word , Word)

這意味着你剛剛叫strcmp(NULL, Word) - >段錯誤

+0

那麼如何做到這一點,因爲我想以搜索字符串,如果它沒有發現,添加它,如果找到則返回它的位置,並增加它的數量由1 –