2012-11-21 83 views
0

我正在实现一个小型搜索引擎。该信息是从文件中获取的,并且包含该词的所有搜索都会返回。问题是当我在while循环中运行搜索函数时,一个分段错误的错误,但当我运行它没有一个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; 
} 
+1

'while(!fin.eof())'是错误的。 http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong –

+0

问题不在于此while循环,而是最后一个。但感谢您指出。 – User14229754

+0

那你为什么要发布整件事? –

回答

3

分割故障可能是由于delete []上的指针的使用不是由一个调用返回到new[]:没有张贴在代码中的关键字new的一个实例,但有一个delete的实例。

+0

即使我删除了删除命令,问题仍然存在。 – User14229754

+0

@ User14229754现在是您通过调试器运行代码并尝试将问题隔离到一小段代码的时候。我怀疑有人会替你干这个。 –

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

+0

但短语必须存储几个字,然后我必须access.shouldn't它是标准::矢量 ??对不起,我是新的矢量。 – User14229754

+0

你应该将它们解析成矢量。请注意,有多种方法可以在C++中执行此操作,而不是使用strtok,例如istream_iterator或boost :: tokenize,它们是可重入的。 (因为它保存状态,strtok不会在多个线程中工作)。 – CashCow