在单链接列表中的第一个循环后输入数据时,gets函数将被跳过

问题描述

我正在尝试创建一个程序,在该程序中,我们可以使用单链列表(例如食物名称,份数等)在C中输入Mess(餐厅)详细信息。 这里的食物名称是字符串,在输入食物名称的第一个循环之后,该程序不进行任何输入,但直接跳到insertinto()函数中的“ Enter Servings”。

struct node{

    char food[100];
    int serv;
    int weight;
    int credits;
    struct node *next;
}*head[6],*temp[6],*newnode[6]; //for 7 days a week

int insertinto(){
    int d=0; //just for example
    //linked list insertion
    int ch=0;
    while(ch==0){
        head[d]=0;
        newnode[d]=(struct node *)malloc(sizeof(struct node));
    //newnodex->datax=xx;

        printf("Enter food: ");
        gets(newnode[d]->food); //error occurs here on second iteration of while loop
        printf("Enter Servings: ");
        scanf("%d",&newnode[d]->serv);
        printf("Enter wt per Servings in gram: ");
        scanf("%d",&newnode[d]->weight);
        printf("Enter Credits required for the food to be consumed: ");
        scanf("%d",&newnode[d]->credits);
        newnode[d]->next=0;

        if(head[d]==0){
            head[d]=temp[d]=newnode[d];
        }
        else{
            temp[d]->next=newnode[d];
            temp[d]=newnode[d];
        }

        printf("Do you want to enter the data of more Food?(0=Yes): ");
        scanf("%d",&ch);
    }


};

int main()
{
    insertinto();
}




OUTPUT

解决方法

我还没有测试过,但是:很可能是这样的问题:scanf会读取输入,直到到达newlint ,但将换行符保留在输入缓冲区中

gets进入缓冲区并读取直到到达换行为止,scanf尚未将其删除,因此这是第二次看到的第一件事。

简单修复:在getchar();之后添加scanf

scanf("%d",&ch);
getchar();

还:

请勿使用gets()。因为无法不事先知道数据就无法分辨将读取多少个字符,并且由于gets()将继续存储缓冲区结束后的字符,所以使用它非常危险。它已被用来破坏计算机安全性。改用fgets()。