为什么我的 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;
}