nadgorliwy fgets

0

Witam,
Na zaliczenie wsymarowałem kod, a w nim taki fragmencik:

int add_row(struct produkty * tab)
{
    int i, k, ost;
    printf("Ile produktow chcesz dodac?\n >");
    scanf("%d", &k);
    ost = ostatni_rekord(tab);
    for (i=ost; i<k+ost; i++)
    {
        puts("wprowadzanie produktow\n");
        puts("podaj nazwe nowego produktu\n");
        fgets(tab[i].nazwa, 99, stdin);
        printf("podaj opis nowego produktu\n");
        fgets(tab[i].opis, 99, stdin);
        printf("podaj cene nowego produktu\n");
        scanf("%f", tab[i].cena);
        printf("podaj stan nowego produktu\n");
        fgets(tab[i].stan, 99, stdin);
        printf("podaj lokalizacje nowego produktu\n");
        fgets(tab[i].lokalizacja, 99, stdin);

    }
}
 

pojawia się problem, program po wypisaniu ("podaj nazwe nowego produktu\n") nie czeka na wprowadzenie nazwy tylko przeskakuje Od razu do opisu, tak jakby gets pobierał pusty wiersz z konsoli. Ktoś wie co go boli? I dlaczego nie chce działać?

2

Błąd jest tutaj:

scanf("%d", &k);

Znak nowej linii zostaje w buforze i fgets od razu się kończy. Powinno być:

scanf("%d ", &k);

Po drugie fgets wczytuje napisy razem ze znakiem nowej linii, to może Ci przeszkadzać w przyszłości.

0

Ok, dzięki wielkie, da się jakoś elegancko pozbyć tego problemu? czy tylko coś w stylu walnięcia getchara? i

0

Nie da sie edytować więc drugi post: chodzi mi o zamiennik fgetsa, i lecenie pętlą z getcharem aż nie znajdę '\n' czy da się to jakoś inaczej obejśc?

0

Po prostu pozbądź się tego znaku nowej linii. Ponieważ będzie on na końcu, wystarczy go zastąpić NULL-terminatorem.

Eleganckie rozwiązanie (do znalezienia w 11 sekund) to:

line[strcspn(line, "\n")] = '\0';

1 użytkowników online, w tym zalogowanych: 0, gości: 1