Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:打印链接列表时出现分段错误_C - Fatal编程技术网

C:打印链接列表时出现分段错误

C:打印链接列表时出现分段错误,c,C,我对C相当陌生,但我想构建一个程序,允许用户存储从traceroute/tracert获得的ip地址,该地址首先存储到文本文件中。然后,它允许他们打印下一个/上一个跃点。我使用了一个链表,但是打印给了我一个分段错误 我试着看了一遍,但没有发现任何错误,有人能指出我的错误并指导我吗?提前谢谢 (为可怜的压痕感到抱歉!!) #包括 #包括 #包括 int id=0; int list=0; int节点=0; 文件*读取文件(字符*文件名) { FILE*rawdata=fopen(文件名,“r”);

我对C相当陌生,但我想构建一个程序,允许用户存储从traceroute/tracert获得的ip地址,该地址首先存储到文本文件中。然后,它允许他们打印下一个/上一个跃点。我使用了一个链表,但是打印给了我一个分段错误

我试着看了一遍,但没有发现任何错误,有人能指出我的错误并指导我吗?提前谢谢

(为可怜的压痕感到抱歉!!)

#包括
#包括
#包括
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;
    }