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

セグメンテーション違反は、delete []への呼び出しによって返されなかったポインタに対するの使用が原因である可能性があります。投稿されたコードにnew[]はキーワードの単一のインスタンスはありませんが、 のインスタンスが 1 つあります。newdelete

于 2012-11-21T14:46:03.177 に答える
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 に答える