C++ strcmp()函数中的分段错误
下面的代码用于在创建链表后对其进行排序。使用的排序算法是气泡排序。不知何故,代码在strcmp()函数中引发了一个分段错误 PS:我还编写了另一个版本,其中我没有计算节点的数量,而是使用指针运行循环进行排序。也提出了一个分段错误。这一次是在循环的“条件检查”中C++ strcmp()函数中的分段错误,c++,segmentation-fault,strcmp,C++,Segmentation Fault,Strcmp,下面的代码用于在创建链表后对其进行排序。使用的排序算法是气泡排序。不知何故,代码在strcmp()函数中引发了一个分段错误 PS:我还编写了另一个版本,其中我没有计算节点的数量,而是使用指针运行循环进行排序。也提出了一个分段错误。这一次是在循环的“条件检查”中 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h&
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
using namespace std;
struct link_list
{
char value[20];
struct link_list *next;
};
int main()
{
struct link_list *head=NULL;
int i,j,count=0;
char input[20];
char ch;
struct link_list *temp=NULL,*temp2=NULL,*temp3=NULL,*temp4=NULL;
do /* Creating a link list*/
{
cout<<"Enter the string you want to insert";
cin>>input;
count++;
cout<<"Do you want to continue entering?";
cin>>ch;
if (head==NULL)
{
head=new link_list;
strcpy(head->value,input);
head->next=NULL;
continue;
}
for (temp=head;temp->next!=NULL;temp=temp->next);
temp2=new link_list;
temp->next=temp2;
strcpy(temp2->value,input);
temp2->next=NULL;
}while(ch=='y' || ch=='Y');
/*Printing the link list*/
for (temp=head;temp->next!=NULL;temp=temp->next)
{
cout<<temp->value<<"\n";
}
cout<<temp->value<<"\n";
temp=head;
temp2=head;
/*Using Bubble Sort to sort the list in ascending order*/
for (i=1;i<count-1;i++)
{
if (i==1)
temp=head;
else
temp=temp->next;
for (j=0;j<count-i;j++)
{
if (j==0)
temp4=head;
else
temp4=temp4->next;
temp2=temp4;
/*Comparing two subsequent nodes and swapping pointers if necessary*/
if (strcmp(temp2->value,temp2->next->value)>0)/*<----ERROR in some cases*/
{
/*Case where head node needs to adjusted, 2 nodes present in the list*/
if (temp2==head && temp2->next->next==NULL)
{
cout<<"Special1\n";
head=temp->next;
temp2->next->next=temp;
temp2->next=NULL;
}
/*Case where head node needs to be adjusted*/
else if (temp2==head)
{
cout<<"Special2\n";
head=temp2->next;
temp2->next=head->next;
head->next=temp2;
}
/*Rest of the cases*/
else
{
cout<<"Normal1\n";
temp3->next=temp2->next;
temp2->next=temp3->next->next;
temp3->next->next=temp2;
cout<<"Normal2\n";
}
}
temp3=temp4;
}
}
for (temp=head;temp->next!=NULL;temp=temp->next)
{
cout<<temp->value<<"\n";
}
cout<<temp->value;
getch();
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
结构链接列表
{
字符值[20];
结构链接列表*下一步;
};
int main()
{
结构链接列表*head=NULL;
int i,j,计数=0;
字符输入[20];
char ch;
结构链接列表*temp=NULL,*temp2=NULL,*temp3=NULL,*temp4=NULL;
do/*创建链接列表*/
{
库廷普特;
计数++;
包厢;
if(head==NULL)
{
head=新链接列表;
strcpy(头->值,输入);
head->next=NULL;
继续;
}
对于(临时=头部;临时->下一步!=NULL;临时=临时->下一步);
temp2=新链接列表;
temp->next=temp2;
strcpy(temp2->value,输入);
temp2->next=NULL;
}而(ch='y'| ch='y');
/*打印链接列表*/
对于(临时=头部;临时->下一步!=NULL;临时=临时->下一步)
{
coutnext=温度;
temp2->next=NULL;
}
/*需要调整头部节点的情况*/
else if(temp2==头)
{
coutnext=head->next;
head->next=temp2;
}
/*其余案件*/
其他的
{
coutnext;
temp2->next=temp3->next->next;
temp3->next->next=temp2;
coutnext)
{
cout只有两种可能性:
temp2
无效(或空)
temp2->next
无效(或空)
我猜是第二个问题。您是否尝试使用调试器(例如gdb
)并使用所有警告和调试信息(例如gcc-Wall-g
)进行编译?我猜在您的strcmp
calltemp2->next
中,有时NULL
因此SIGSEGV
我编辑了代码,使用节点数省略了算法,并使用了不同的算法。请参考给定链接中的问题: