为什么我的 C 结构没有在输入中获取任何数据?
Why doesn't my C struct get any data in input?
所以,我试图编写这个程序,其中应该可以创建一个动态列表,其中存储了一些汽车的数据(型号、颜色、年份),然后应该可以查看列表他们所有人。程序中没有错误,也没有分段错误,但是当我尝试可视化列表时,我没有得到任何输出。我尝试使用GDB调试它,而struct指针在输入过程中实际上并没有得到任何数据。这是完整的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
char modello[81];
char colore[81];
int anno;
struct node *next;
};
typedef struct node car;
car* insertNode(car* head);
car* destroyer(car* head);
void visualizer(car *head);
int main(){
car *head = NULL;
int n,tasto;
char option,enter;
do{
printf("Premere 1 per inserire un nuovo veicolo nel catalogo.\n");
printf("Premere 2 per visualizzare l'intero catalogo.\n");
printf("Premere qualsiasi altro tasto per uscire.\n\n");
scanf("%i",&tasto);
switch (tasto){
case 1:
insertNode(head);
break;
case 2:
visualizer(head);
break;
default:
break;
}
}while(tasto==1||tasto==2);
if(head!=NULL)
head=destroyer(head);
printf("Uscita.\n");
return 0;
}
car* insertNode(car *head){
car *temp;
car *prec;
temp=(car *)malloc(sizeof(car));
if(temp!=NULL){
temp->next=NULL;
if(head==NULL)
head=temp;
else{//Raggiungi il termine della lista
for(prec=head;(prec->next)!=NULL;prec=(prec->next));
prec->next=temp;
}
printf("Inserire il modello dell'auto: ");
scanf("%s",&temp->modello);
printf("Inserire il colore dell'auto: ");
scanf("%s",&temp->colore);
printf("Inserire l'anno di immatricolazione dell'auto: ");
scanf("%i",&temp->anno);
printf("\n");
}
else
printf("Memoria esaurita!\n");
return head;
}
void visualizer(car* head){
car *temp;
int i=1;
temp=head;
while(temp!=NULL){
printf("Auto numero %i:\n",i);
printf("Modello: %s.\n",temp->modello);
printf("Colore: %s.\n",temp->colore);
printf("Anno di immatricolazione: %i.\n",temp->anno);
printf("\n");
i++;
temp=temp->next;
}
}
car *destroyer(car* head){
car *temp;
while(head!=NULL){
temp=head;
head=head->next;
free(temp);
}
return NULL;
}
谁能解释一下为什么会这样?我不知道这有什么问题。
第一个错误是在 do while 中,当您在 case switch 的第 31 行时,您没有在任何地方存储插入函数的 return。这是固定代码:
do{
printf("Premere 1 per inserire un nuovo veicolo nel catalogo.\n");
printf("Premere 2 per visualizzare l'intero catalogo.\n");
printf("Premere qualsiasi altro tasto per uscire.\n\n");
scanf("%i",&tasto);
switch (tasto){
case 1:
head=insertNode(head);
break;
case 2:
visualizer(head);
break;
default:
break;
}
}while(tasto==1||tasto==2);
第二个错误是当您在插入节点中从键盘获取值时。
当您已经有了要填充的数组的地址时,您正在使用“&”运算符,因为您确实在使用数组。这里可以看到固定的代码:
car* insertNode(car *head){
car *temp;
car *prec;
temp=(car *)malloc(sizeof(car));
if(temp!=NULL){
temp->next=NULL;
if(head==NULL)
head=temp;
else{//Raggiungi il termine della lista
for(prec=head;(prec->next)!=NULL;prec=(prec->next));
prec->next=temp;
}
printf("Inserire il modello dell'auto: ");
scanf("%s",temp->modello);
printf("Inserire il colore dell'auto: ");
scanf("%s",temp->colore);
printf("Inserire l'anno di immatricolazione dell'auto: ");
scanf("%i",&temp->anno);
printf("\n");
}
else
printf("Memoria esaurita!\n");
return head;
}
所以,我试图编写这个程序,其中应该可以创建一个动态列表,其中存储了一些汽车的数据(型号、颜色、年份),然后应该可以查看列表他们所有人。程序中没有错误,也没有分段错误,但是当我尝试可视化列表时,我没有得到任何输出。我尝试使用GDB调试它,而struct指针在输入过程中实际上并没有得到任何数据。这是完整的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
char modello[81];
char colore[81];
int anno;
struct node *next;
};
typedef struct node car;
car* insertNode(car* head);
car* destroyer(car* head);
void visualizer(car *head);
int main(){
car *head = NULL;
int n,tasto;
char option,enter;
do{
printf("Premere 1 per inserire un nuovo veicolo nel catalogo.\n");
printf("Premere 2 per visualizzare l'intero catalogo.\n");
printf("Premere qualsiasi altro tasto per uscire.\n\n");
scanf("%i",&tasto);
switch (tasto){
case 1:
insertNode(head);
break;
case 2:
visualizer(head);
break;
default:
break;
}
}while(tasto==1||tasto==2);
if(head!=NULL)
head=destroyer(head);
printf("Uscita.\n");
return 0;
}
car* insertNode(car *head){
car *temp;
car *prec;
temp=(car *)malloc(sizeof(car));
if(temp!=NULL){
temp->next=NULL;
if(head==NULL)
head=temp;
else{//Raggiungi il termine della lista
for(prec=head;(prec->next)!=NULL;prec=(prec->next));
prec->next=temp;
}
printf("Inserire il modello dell'auto: ");
scanf("%s",&temp->modello);
printf("Inserire il colore dell'auto: ");
scanf("%s",&temp->colore);
printf("Inserire l'anno di immatricolazione dell'auto: ");
scanf("%i",&temp->anno);
printf("\n");
}
else
printf("Memoria esaurita!\n");
return head;
}
void visualizer(car* head){
car *temp;
int i=1;
temp=head;
while(temp!=NULL){
printf("Auto numero %i:\n",i);
printf("Modello: %s.\n",temp->modello);
printf("Colore: %s.\n",temp->colore);
printf("Anno di immatricolazione: %i.\n",temp->anno);
printf("\n");
i++;
temp=temp->next;
}
}
car *destroyer(car* head){
car *temp;
while(head!=NULL){
temp=head;
head=head->next;
free(temp);
}
return NULL;
}
谁能解释一下为什么会这样?我不知道这有什么问题。
第一个错误是在 do while 中,当您在 case switch 的第 31 行时,您没有在任何地方存储插入函数的 return。这是固定代码:
do{
printf("Premere 1 per inserire un nuovo veicolo nel catalogo.\n");
printf("Premere 2 per visualizzare l'intero catalogo.\n");
printf("Premere qualsiasi altro tasto per uscire.\n\n");
scanf("%i",&tasto);
switch (tasto){
case 1:
head=insertNode(head);
break;
case 2:
visualizer(head);
break;
default:
break;
}
}while(tasto==1||tasto==2);
第二个错误是当您在插入节点中从键盘获取值时。 当您已经有了要填充的数组的地址时,您正在使用“&”运算符,因为您确实在使用数组。这里可以看到固定的代码:
car* insertNode(car *head){
car *temp;
car *prec;
temp=(car *)malloc(sizeof(car));
if(temp!=NULL){
temp->next=NULL;
if(head==NULL)
head=temp;
else{//Raggiungi il termine della lista
for(prec=head;(prec->next)!=NULL;prec=(prec->next));
prec->next=temp;
}
printf("Inserire il modello dell'auto: ");
scanf("%s",temp->modello);
printf("Inserire il colore dell'auto: ");
scanf("%s",temp->colore);
printf("Inserire l'anno di immatricolazione dell'auto: ");
scanf("%i",&temp->anno);
printf("\n");
}
else
printf("Memoria esaurita!\n");
return head;
}