Wczytywanie danych w funkcji [C]

0

Witam
Mam problem z programem:

#include <stdio.h>
#include <stdlib.h>

#define MAXN 20
#define MAXI 20
#define MAXO 100
#define MAXG 15
//////////////////////
struct student { 
       char nazwisko[MAXN]; 
       char imie[MAXI]; 
       unsigned short int wiek; 
       unsigned short int oceny_proc[MAXO]; 
       }grupa[MAXG];
//////////////////////////////       
void wczytaj(struct student *st){

	int i;
	for (i=0; i<MAXG; i++){
		printf("podaj nazwisko studenta %i\n", i+1);
		gets(st[i].nazwisko);
		printf("podaj imie studenta %i\n", i+1);
		gets(st[i].imie);
		
	 }
  }

//////////////////////PROGRAM////////////////////////////
int main(int argc, char *argv[])
{
    
    int opcja=7;
                                                            //menu
     printf("Co chcesz zrobic? : \n1.Wpisac dane.\n2.Zapisac do pliku.\n9.Zakonczyc");
     scanf ("%i", &opcja);
     if(opcja==1) wczytaj(grupa);
 

  
  system("PAUSE");	
  return 0;
}
 

Program pomija nazwisko pierwszego studenta. Bez menu wszystko jest ok. W czym może być problem?

1

po:
scanf ("%i", &opcja);
wstaw:
while(getchar()!='\n') {}

0

Pomogło. Dzięki :)
A tak z ciekawości to z czego to wynika? Czemu bez tej dodatkowej linijki nie działało?

0

Jeżeli przy wyborze wpisujesz:
1<Enter>
to w buforze klawiatury będziesz miał dwa znaki 1 oraz '\n'
scanf("%i",...)
wczyta ci pierwszy znak zaś enter zostanie w buforze klawiatury.
Dalej zaczyna pracę
gets()
który wczytuje znaki do '\n', więc dostajesz pusty wiersz.
Wywal tą linijkę co zaproponowałem, a przy opcjach wpisz:
1Sikorski<Enter>
To ci wybierze wprowadzenie a nazwisko od razu pobierze Sikorski.
Tak a propos przeczytałeś komentarz do twojego postu wyżej?

0

Tak, dzięki :)

0
_13th_Dragon napisał(a)

po:
scanf ("%i", &opcja);
wstaw:
while(getchar()!='\n') {}

może lepiej fflush(stdin);?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.