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++。这几天它的使用越来越多。