c-gets()函数在单链表中第一个循环后输入数据时被跳过



我正在尝试创建一个程序,在这个程序中,我们可以使用单链表在C中输入餐厅的详细信息,例如食物名称、服务数量等。这里食物名称是字符串,在输入食物名称的第一个循环之后,程序不接受任何输入,而是直接跳到";输入Servings";在insertint((函数中。

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();
}


输出

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

gets查看缓冲区并进行读取,直到到达尚未被scanf删除的换行符,所以这是它第二次看到的第一个内容。

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

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

此外:

永远不要使用gets((。因为在不事先知道数据的情况下,不可能知道gets((将读取多少个字符,而且gets(((将继续存储超过缓冲区末尾的字符,所以使用它是极其危险的。它被用来破坏计算机安全。请改用fgets((。

相关内容

  • 没有找到相关文章

最新更新