0

我正在实现一个小型搜索引擎。信息取自一个文件并返回所有包含该单词的搜索。问题是当我在 while 循环中运行搜索功能时,出现分段错误错误但是当我运行它时没有while循环,它运行顺利..我已经重新检查了很多次代码,但找不到任何问题。任何帮助将不胜感激。

 //searches individual words which are given to it.array has some data in it
int search_word(string word,string array)
{
    int counter=0;
    size_t found;
    int i=0;
    for (i=array.find(word,0);i!=string::npos;i=array.find(word,i))
    {
       counter+=1;
       i++;
    }
   return counter;
}



//this is sorting(descending) the linked list of results and storing it in an array
void Rank()
{
   struct results *go;
   go=head;
   int array[54];
   int l=0;
   while (go->next!=0)
   {
       array[l]=go->number;
       array1[l]=go->result;
       go=go->next;
       ++l;
   }
   array[l]=go->number;
   array1[l]=go->result;
   int temp;
   string temp1;
   for (int k=0;k<l;k++)
   {
       for (int j=(k+1);j<l+1;j++)
       {
          if (array[k]<array[j])
          {
             temp=array[k];
             array[k]=array[j];
             array[j]=temp;
             temp1=array1[k];
             array1[k]=array1[j];
             array1[j]=temp1;
          }
        }                  
    }
    cout<<"Following results were found"<<endl;
    for (int a=0;a<l;++a)
    {
       cout<<"Result no."<<a<<endl;
       cout<<array1[a]<<endl;
       cout<<endl;
    }
 }

 //main search function                
 void search(string array[])
 {
    //words like the,a,he,they,would are low rank words
   ifstream fin;
   fin.open("lowRank.txt");
   string lowrank;
   int j=0;
   while (!fin.eof())
   {
       string buffer;
       do
       {
           getline(fin,buffer);
           lowrank+=" ";
           lowrank+=buffer;
           ++j;
       }
       while (!buffer.empty());
   }
   fin.close();
   cout<<"Enter a word or phrase"<<endl;
   //converting the string containing words into seperate strings by tockenisation
   string setofwords[10];
   char phrase[50];
   cin.get(phrase,50);
   int count=0;
   char *pointer= NULL;
   pointer=strtok(phrase," ");
   while (pointer!=NULL)
   {
       char *pointer= NULL;  
       setofwords[count]=pointer;    
       pointer=strtok(NULL," ");
       count+=1; 
       delete [] pointer;
   }      

   for (int i=0;i<54;i++)
   {
       int counter=0;int counter1=0;
       //searching for all words one by one in the below loop       
       for (int k=0;k<count;k++)    
       {         
          //searching if word is low rank
           size_t found;
           found=lowrank.find(setofwords[k]);                 
           if (found!=string::npos)
           {
               counter=search_word(setofwords[k],array[i]);
               if (counter>0)
               {                    
                   counter1+=1;
               }
           }
           else
           {                                        
               counter=search_word(setofwords[k],array[i]);
               counter1+=counter;                   
           }        
        } 
     if (counter1>0)
     {
         add_result(array[i],counter1);
     }
   }
   Rank();
 }

int main()
{
  //reading the data file and copying it into an a linked list 
   ifstream fin;
   fin.open("data.txt");
    while (!fin.eof())
    {      
        string url;
        string data;
        getline(fin,url);
        string buffer;
       do
       {
            getline(fin,buffer);           
            if (!buffer.empty())
            {
               data=buffer;
            }
       }
       while (!buffer.empty());
       add_node(url,data);
   }
  //copying linked list to an array
  string array[54];
  node *conductor;
  conductor=root;
  for (int i=0;i<54;i++)
  {
      array[i]=conductor->url+conductor->data;
      conductor=conductor->next;
  }                   

  fin.close();

  while (1)
  {              


         cout<<"*******************************SEARCH                                  
         ENGINE********************************"<<endl;
        cout<<endl;
        cout<<endl;
        cout<<endl;
        cout<<"1.Press 1 to search a word."<<endl;
      cout<<"5.Press 5 to quit without saving search results"<<endl;

     int ans; 

      cin>>ans;     
      if (ans==1)
      {     
          search(array);
          search(array);
      }

      else if (ans==5)
      {
          quit_without_saving();
      }
      }

system("PAUSE");
return 0;
}
4

2 回答 2

3

您的错误出现在以下代码行中:

char phrase[50];
cin.get(phrase,50);
int count=0;
char *pointer= NULL;
pointer=strtok(phrase," ");
while (pointer!=NULL)
{
   char *pointer= NULL;  
   setofwords[count]=pointer;    
   pointer=strtok(NULL," ");
   count+=1; 
   delete [] pointer;
}

strtok实际上返回一个指向你传入的字符的指针,在这种情况下是phrase.

phrase在堆栈上创建。

因此你不能调用delete[]它。顺便说一句,您也不能delete[]在分配块的中间调用,它必须正是从new[]调用返回的指针。

顺便说一句,如果您需要更改代码以便phrase需要在运行时知道其大小,请不要使用new[]而是将短语转换为std::vector<char>,您可以使用&phrase[0]它来获取其第一个元素。再次,无需调用delete[]

于 2012-11-21T14:55:27.927 回答
3

分段错误可能是由于delete []调用未返回的指针上的使用new[]:发布的代码中没有关键字的单个实例new,但有一个实例delete

于 2012-11-21T14:46:03.177 回答