由于 while 循环导致的分段错误错误

Segmentation fault error due to a while loop

本文关键字:错误 分段 while 循环 由于      更新时间:2023-10-16

我正在实现一个小搜索引擎。信息是从文件中获取的,并且返回所有包含单词的搜索.问题是当我在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;
}

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

您的错误在于以下代码行:

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[]