如何在结构数组中搜索字符串?

时间:2017-03-09 08:55:39

标签: c arrays string search structure

我想确定在命令行参数中传递的单词的频率,所以我定义了一个带有字符串的结构并计算它,现在问题是当我试图搜索字符串时在Structure数组中,通过使用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 个答案:

答案 0 :(得分:3)

我建议你做一些改正。

首先,我认为你在写这篇文章时试图初始化结构数组。

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

答案 1 :(得分:0)

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

意思是你刚刚调用strcmp(NULL, Word) - &gt;段错误