C 我的代码中的链表和分段错误

C 我的代码中的链表和分段错误,c,pointers,linked-list,C,Pointers,Linked List,我的代码如下:它要求用户输入行星名称、距离和描述。然后,它将打印出用户输入的任何内容 #include <stdio.h> #include <string.h> #include <stdlib.h> /* planet type */ typedef struct{ char name[128]; double dist; char description[1024]; } planet_t; /* my planet_node */ ty

我的代码如下:它要求用户输入行星名称、距离和描述。然后,它将打印出用户输入的任何内容

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/* planet type */
typedef struct{
  char name[128];
  double dist;
  char description[1024];
} planet_t;

/* my planet_node */
typedef struct planet_node {
  char name[128];
  double dist;
  char description[1024];
  struct planet_node *next;
} planet_node;

/* the print function, not sure if its correct */
void print_planet_list(planet_node *ptr){
  while(ptr != NULL){
    printf("%s %lf %s\n", ptr->name, ptr->dist, ptr->description);
    ptr=ptr->next;
  }
  printf("\n");
}

int main(){
  char buf[64];
  planet_node *head = NULL;
  int quit = 0;

  do {
    printf("Enter planet name (q quits): ");
    scanf("%s",buf);
    if((strcmp(buf,"q")==0)){
      quit = 1;
    }
    else{
      planet_node *new = malloc(sizeof(planet_node));       /* New node */
      strcpy((*new).name, buf);         /* Copy name */
      printf("Enter distance and description: ");
      scanf(" %lf ", new->dist); /* Read a new distance into pluto's */
      gets(new->description);      /* Read a new description */
      new->next = head;        /* Link new node to head */
      head=new;        /* Set the head to the new node */
    }
  } while(!quit);

  printf("Final list of planets:\n");
  print_planet_list(head);


  while(head != NULL){
    planet_node *remove = head;
    head = (*head).next;
    free(remove);
  }
}
#包括
#包括
#包括
/*行星类型*/
类型定义结构{
字符名[128];
双区;
字符描述[1024];
}行星t;
/*我的星球节点*/
类型定义结构行星节点{
字符名[128];
双区;
字符描述[1024];
结构行星_节点*下一步;
}行星_节点;
/*打印功能,不确定是否正确*/
无效打印行星列表(行星节点*ptr){
while(ptr!=NULL){
printf(“%s%lf%s\n”,ptr->name,ptr->dist,ptr->description);
ptr=ptr->next;
}
printf(“\n”);
}
int main(){
char-buf[64];
行星_节点*head=NULL;
int-quit=0;
做{
printf(“输入行星名称(q退出):”;
scanf(“%s”,buf);
如果((strcmp(buf,“q”)==0)){
退出=1;
}
否则{
行星_节点*新建=malloc(sizeof(行星_节点));/*新建节点*/
strcpy((*新).name,buf);/*副本名称*/
printf(“输入距离和描述:”);
scanf(“%lf”,new->dist);/*将新距离读入冥王星的*/
获取(新建->说明);/*读取新说明*/
新建->下一步=头部;/*将新节点链接到头部*/
head=new;/*将head设置为新节点*/
}
}而(!退出);
printf(“行星的最终列表:\n”);
打印行星列表(标题);
while(head!=NULL){
行星_节点*移除=头部;
头=(*头)。下一步;
自由(移除);
}
}
我发表评论的地方是我不确定它是否正确的地方,代码符合,但给了我一个分段错误。 有什么帮助吗?谢谢。

scanf(“%lf”,new->dist)

这就是你的错误所在。 应该是:

scanf(“%lf”和(new->dist))

另外,额外的“”会使其接受额外的字符。这是可以避免的

scanf(“%lf”和(new->dist))
scanf(“%lf”,新建->距离)

这就是你的错误所在。 应该是:

scanf(“%lf”和(new->dist))

另外,额外的“”会使其接受额外的字符。这是可以避免的


scanf(“%lf”和(new->dist))

您是否编译了包含所有警告和调试信息的代码(在Linux上使用
gcc-Wall-g
)?然后改进代码,直到没有发出警告。最后使用一个调试器(
gdb
在Linux上)和一个泄漏检测器(
valgrind
在Linux上)进行调试。虽然我确实改变了“新”——这是C++中的关键字。@所以,如果使用.c扩展名,它的编译效果很好。@PrototypeStark:我知道,把一个变量称为“new”感觉很有趣。)@是的,我知道;):PDid您是否使用所有警告和调试信息编译代码(在Linux上使用
gcc-Wall-g
)?然后改进代码,直到没有发出警告。最后使用一个调试器(
gdb
在Linux上)和一个泄漏检测器(
valgrind
在Linux上)进行调试。虽然我确实改变了“新”——这是C++中的关键字。@所以,如果使用.c扩展名,它的编译效果很好。@PrototypeStark:我知道,把一个变量称为“new”感觉很有趣。)@是的,我知道;):p通知此错误将被发出警告的
gcc-Wall
捕获。@BasileStrynkevitch不幸的是,我没有gcc,但我在第一次阅读时就捕获了它。:P.我头脑中的编译器速度较慢,但更准确(我认为):作为参考,实际警告是“test.c:44:7:warning:format'%lf'需要类型为'double*'的参数,但参数2的类型为'double'[-Wformat]test.c:60:1:warning:control到达非空函数的末尾[-Wreturn type]”谢谢@harpun,我正在认真考虑安装cygwin和gcc/g++。最近它的使用越来越多。请注意,
gcc-Wall
会发出警告,从而捕捉到此错误。@BasileStarynkevitch不幸的是,我没有gcc,但我在第一次阅读时就捕捉到了它P.我头脑中的编译器速度较慢,但更准确(我认为):作为参考,实际警告是“test.c:44:7:warning:format'%lf'需要类型为'double*'的参数,但参数2的类型为'double'[-Wformat]test.c:60:1:warning:control到达非空函数的末尾[-Wreturn type]”谢谢@harpun,我正在认真考虑安装cygwin和gcc/g++。这几天它的使用越来越多。