wpisywanie tresci z uwzglednieniem spacji do listy jednokierunkowej

0

Przechwytywanie.PNGMam problem, musze stworzyc baze danych, w ktorej musze wpisac tresc zadania,
moja struktura sklada sie z 7-miu intow oraz jednej tablicy znakowej char[200],
uzywajac fgets(nowe->tresc_zadania, sizeof(nowe->tresc_zadania),stdin) przy odpalaniu programu kompletnie pomija tego fgetsa, probowalem poprzedzajac go fflush(stdin), niestety nic nie dziala. Ponizej daje screen problemu

0

https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

Zamieściłeś za mało kodu i trzeba zgadywać. Zapewne w menu pobierasz znak za pomocą jakiegoś getc, pozostawiając znak nowej linii w buforze, przez co pierwszy scanf napotyka tę nową linię.

0

podałem bez intów w strukturze

typedef struct zadanie
{
 
       char tresc_zadania[200];
       struct zadanie* next;
              } zadanie ;
 void dodaj(zadanie** lista, zadanie* nowe)
{
     nowe->next=NULL;
 
     if((*lista)==NULL)
     {
      *lista = nowe;
                     }
     else
     {
         zadanie* wsk = *lista;
         while(wsk->next != NULL)
         {
			  wsk = wsk->next;
			}
         
         wsk->next = nowe;
	 }   
 }         
              
void dodaj_zadanie(zadanie** lista)
{   
     zadanie* nowe = (zadanie*)malloc(sizeof(zadanie));
     printf("Podaj tresc zadania:");
     fflush(stdin);
     fgets(nowe->tresc_zadania,sizeof(nowe->tresc_zadania),stdin);

     
 
     dodaj(lista, nowe);     
}

int main()
{
    zadanie* lista = NULL;
 
              int opcja;
 
 while(opcja != 0)
           {
printf("\n\n MENU");
printf("\n\n\n 0 Wyjscie z programu");
printf("\n 1 Wpisz dane zadania do bazy");
 
           scanf("%d", &opcja);
 
           switch(opcja)
           {             
 
                         case 1: 
                              printf("DODAWANIE ZADANIA\n");
                              dodaj_zadanie(&lista);
                              break;
 
                        
          }
 

1

poczytaj jak działa scanf
http://www.cplusplus.com/reference/cstdio/scanf/

Z tym stringiem formatującym: "%d" wczytujesz liczbę (by wybrać opcję 1), ale wszystkie białe znaki po tej liczbie czekają na wczytanie, wiec jeśli masz tam znak końca linii.
Efekt jest taki, że fgets wczyta tylko to co jest do końca linii, którą podałeś podczas wybierania opcji, czyli NIC, bo prawdziwe dane chciałeś dostać w linii następnej.


offtopic: Nigdy nie wklejaj kodu jako obrazek! Jak coś trzeba będzie sprawdzić to nikomu się nie będzie chciało przepisywać z obrazka. Zawartość konsoli też można skopiować jako tekst.
0

przeczytalem caly artykul, nie jestem w stanie zrozumiec tego problemu. scanf powinien przyjmowac tylko i wylacznie 1-nke, pozniej jest printf, odpalenie funkcji, printf i ten nieszczesny fgets, probowalem usuwac printfy, przeksztalcac kod, ale za kazdym razem pomija wpisywanie tresci zadania. :/

0

Dokładnie, scanf wczytuje 1, po której to jedynce jest znak nowej linii - i on zostaje w buforze. fgets wczytuje całą linię - czyli wszystkie znaki do znaku nowej linii. Ponieważ jest on pierwszy w linii, wczytuje pustą linię.

0

nie jestem w stanie naprawic tego problemu, moglby ktos jakos naprowadzic co powinienem zrobic?

1

Ja wpisujesz wybór opcji to w buforze danych do odczytu masz: 1\n.
Potem sacanf wczytuje ci tą jedynką i w buforze zostaje \n.
Potem robisz printf z prośbą o treść zadania, wywołujesz fgets, które widzi że ma w buforze danych linię do odczytania, wiec nie czeka już na nowe dane, tylko czyta to co zostało w buforze, czyli \n.

Poprzedź linijkę z fgets z scanf(" ");, albo fflush(stdin).

0

Jezu dzięki, jedyne czego nie rozumiałem, to że scanf wczytuje jedynkę a w buforze zostaje \n, czyli znak nowej linii, ogromne dzięki!

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