Функция gets () пропускается при вводе данных после первого цикла в односвязном списке

Я пытаюсь создать программу, в которой мы можем вводить детали Mess (Canteen) на C, используя односвязный список, такой как название еды, количество порций и т. Д. Здесь название еды находится в строке и после первого цикла при вводе названия еды программа не принимает никаких данных, а сразу переходит к функции «Ввести сервировки в функцию insertinto ()».

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




ВЫХОД


person Something Nice    schedule 17.10.2020    source источник
comment
Отвечает ли это на ваш вопрос? Функция Gets (string #), пропущенная, сначала получает запрос   -  person wimh    schedule 17.10.2020
comment
Если вы используете Visual Studio, обратите внимание, что метод gets () был сломан довольно давно. fgets (..., stdin) все еще работает.   -  person rcgldr    schedule 17.10.2020


Ответы (1)


Я не тестировал это, но: Вероятно, проблема в том, что scanf считывает ввод, пока не достигнет newlint , но сохраняет новую строку во входном буфере.

gets просматривает буфер и читает, пока не достигнет новой строки, которая не была удалена scanf, поэтому это первое, что он видит во второй раз.

Простое исправление: добавьте getchar(); после scanf:

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

ТАКЖЕ:

Никогда не используйте gets (). Поскольку невозможно сказать, не зная заранее данных, сколько символов будет читать get (), и поскольку gets () будет продолжать хранить символы после конца буфера, его использование чрезвычайно опасно. Он использовался для взлома компьютерной безопасности. Вместо этого используйте fgets ().

person Mysak0CZ    schedule 17.10.2020
comment
ИМО, лучшее решение - не путать scanf, а не смешивать методы ввода. Используйте scanf() везде или fgetssscanf()) везде. - person Weather Vane; 17.10.2020