由于 while 循环导致的分段错误错误
Segmentation fault error due to a while loop
我正在实现一个小搜索引擎。信息是从文件中获取的,并且返回所有包含单词的搜索.问题是当我在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[]
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 为什么我使用 std::copy() 收到运行时错误(分段错误)?
- 为什么我的代码包含错误分段错误(核心转储)?
- 为什么会出现此错误?- 分段错误(核心转储)
- 意外的运行时错误(分段错误)
- C++将文本文件读入数组,运行错误:分段错误
- mmap 错误:分段错误/指针无效错误
- 在我的代码中找不到错误....分段错误
- 错误:分段故障(核心转储)阵列
- 用string.h将错误分段到队列中
- c++字符串流转换错误:分段错误
- 为什么我的代码显示错误分段错误(核心转储)