C:打印链接列表时出现分段错误
我对C相当陌生,但我想构建一个程序,允许用户存储从traceroute/tracert获得的ip地址,该地址首先存储到文本文件中。然后,它允许他们打印下一个/上一个跃点。我使用了一个链表,但是打印给了我一个分段错误 我试着看了一遍,但没有发现任何错误,有人能指出我的错误并指导我吗?提前谢谢 (为可怜的压痕感到抱歉!!)C:打印链接列表时出现分段错误,c,C,我对C相当陌生,但我想构建一个程序,允许用户存储从traceroute/tracert获得的ip地址,该地址首先存储到文本文件中。然后,它允许他们打印下一个/上一个跃点。我使用了一个链表,但是打印给了我一个分段错误 我试着看了一遍,但没有发现任何错误,有人能指出我的错误并指导我吗?提前谢谢 (为可怜的压痕感到抱歉!!) #包括 #包括 #包括 int id=0; int list=0; int节点=0; 文件*读取文件(字符*文件名) { FILE*rawdata=fopen(文件名,“r”);
#包括
#包括
#包括
int id=0;
int list=0;
int节点=0;
文件*读取文件(字符*文件名)
{
FILE*rawdata=fopen(文件名,“r”);
返回原始数据;
}
无效打印菜单()
{
printf(“==============================================\n\n”);
printf(“1.网络节点先前跃点的报告ID\n”);
printf(“2.识别网络节点的下一个跃点\n”);
printf(“3.退出\n”);
}
int getInput()
{
智力选择;
printf(“请选择您的选择(1到3)=>:”;
scanf(“%d”,选择(&C);
回报选择;
}
结构节点信息{
int-ID;
int IP1;
int IP2;
int IP3;
int IP4;
结构NodeInfo*下一步;
结构节点信息*prev;
};
类型定义结构节点信息节点;
节点*拓扑;
节点*创建节点(int ip1、int ip2、int ip3、int ip4)
{
Node*newNode=malloc(sizeof(Node));
新建节点->IP1=IP1;
新建节点->IP2=IP2;
新建节点->IP3=IP3;
新建节点->IP4=IP4;
newNode->next=0;//空指针
newNode->prev=0;//空指针
返回newNode;
}
void addToBack(节点*临时节点)
{
节点*n=拓扑;
节点*tail=0;
while(n!=NULL){
尾=n;
n=n->next;
}
tail->next=tempnode;
tempnode->prev=尾部;
}
作废打印文件(文件*新文件)
{
字符数据[256],nth1[50],nth2[50],nth3[50],nth4[50],nth5[50],
nth6[50]、nth7[50]、ip[50]、ip2[15]、ip2new[14];
int linecount=-1,strlength;
int ip1、ip2x、ip3、ip4;
int ip11、ip21、ip31、ip41;
if(newFile==NULL){
printf(“打开此文件时出错\n”);
}否则{
while(fgets(数据,256,新文件)!=NULL){
如果(行数!=3){
linecount++;
继续;
}否则{
如果(行数==3&&data[2]!='\0'){
sscanf(数据,“%s%s%s%s%s%s%s%s”、第1、第2、第3、第4、,
nth5、nth6、nth7、ip);
sscanf(数据,“%s%s%s%s%s%s%s%d.%d.%d”,第1个,第2个,
nth3、nth4、nth5、nth6、nth7、ip1、ip2x、ip3、ip4);
如果((ip[0]=“a”)
||(ip[0]=“A”)){
sscanf(数据,“%s%s%s%s%s%s%s%s%s”,
nth1、nth2、nth3、nth4、nth5、nth6、nth7、ip、ip2);
//使用附加主机名重新扫描异常结果
strncpy(ip2new,ip2+1,strlen(ip2)-2);
ip2new[strlen(ip2)-2]='\0';
int i;
字符*温度;
char*ipcmp[4];
i=0;
温度=标准温度(ip2new,“.”);
while(temp!=NULL){
ipcmp[i++]=温度;
温度=strtok(空,“.”);
}
Node*tempnode=createNode(ip2new);
如果(拓扑!=0){
addToBack(tempnode);
}否则{
拓扑=临时节点;
}
}否则{
printf(“%s\n”,ip);
printf(“%d.%d.%d.%d\n”,ip1、ip2x、ip3、ip4);
Node*tempnode2=createNode(ip);
如果(拓扑!=0){
addToBack(tempnode2);
}否则{
拓扑=tempnode2;
}
继续;
}
}
如果(行数==3&&data[2]=='\0'){
行数=-2;
printf(“\n”);
}
}
}
}
}
void printNodes()
{
节点*n=拓扑;
而(n!=0){
printf(“节点为%d.%d.%d.%d\n”,n->IP1,n->IP2,n->IP3,n->IP4);
n=n->next;//跳到下一个节点
}
}
int main(int argc,char*argv[])
{
int选项,失败;
文件*文件数据;
字符*文件;
file=argv[1];
filedata=readFile(file);//打开文件
printFile(filedata);//打印ip地址
做{
打印菜单();
option=getInput();
开关(选件){
案例1:
printf(“您已选择1\n\n”);
失败=0;
printNodes();
打破
案例2:
printf(“您已选择2\n\n”);
失败=0;
打破
案例3:
失败=1;
打破
违约:
printf(“请输入有效的选项(1-3)\n”);
失败=0;
打破
}
}while(fail!=1);
while(拓扑!=0){
自由(拓扑);
拓扑=拓扑->下一步;
}
}
您的创建节点方法有4个参数:
Node *createNode(int ip1, int ip2, int ip3, int ip4)
但您只通过传递一个参数来调用此方法:
Node *tempnode = createNode(ip2new);
Node *tempnode2 = createNode(ip);
当方法只接受整数时,也可以传递数组
这至少是代码中的两个错误源。我可以发现两个更正。首先是调用的
createNode()
参数数量错误。您已经定义了createNode()
来接受4个整型参数,但是在每次调用中,您都要向它传递一个字符串参数。编译器应该给你一个关于这个问题的诊断(我的编译器拒绝编译代码)。永远不要忽略编译器诊断(至少,在没有完全理解诊断的含义之前)
更改这些调用以使用扫描的4个整数变量
Node *tempnode = createNode(ip1, ip2x, ip3, ip4);
Node *tempnode2 = createNode(ip1, ip2x, ip3, ip4);
第二个错误是,if(linecount!=3){
仅允许您在linecount
等于3时处理数据,这可能不是您想要做的。您的意思可能是在linecount
变为3后处理所有数据行
if (linecount < 3) {
linecount++;
continue;
} else {
这里有几个问题
NULL
和0
。虽然两者都可以使用,但在C语言中使用NULL
是惯用的用法,并且最好在使用中保持一致createNode
if (linecount < 3) { linecount++; continue; } else {
while (Topology != 0) {
void *cur = Topology;
Topology = Topology->next;
free(cur);
}
while (Topology != 0) {
free(Topology);
Topology = Topology->next;
}