Fragment w mojego programu w języku C:
Kod:
include <stdio.h> //printf, puts, scantf, fgets
#define MAX_LIMIT 30
struct t_data //deklaracja struktury daty urodzenia
{
unsigned dzien, miesiac, rok;
};
struct t_osoba //deklaracja struktury osoby
{
char nazwisko[30];
char imie[12];
struct t_data data_ur;
} lista[MAX_LIMIT];
int descSorting; //deklaracja zmiennej liczbowej przyjmującej 1 dla sortowania malejącego
void Add(void);
int GetText(char description[], int max, char target[max]);
int GetDate(int n);
int IsCorrect(int day, int month);
void SortAndDisplay(int desc);
int Precedes(int a, int b);
int main(void)
{
(...)
char operation;
puts("\nProgram służy do sortowania 30 osób według daty urodzenia."); //opis programu
Add(); //dodaj nowe osoby
SortAndDisplay(0); //sortuj według daty rosnąco i wyświetl osoby
do
{
if (descSorting == 0)
{
printf("\n\n1. Sortuj według daty malejąco.\n"); //pierwsza operacja do wyboru przy sortowaniu rosnącym
}
else
{
printf("\n\n1. Sortuj według daty rosnąco.\n"); //pierwsza operacja do wyboru przy sortowaniu malejącym
}
if (!(lista[29].data_ur.dzien > 0))
{
printf("2. Dodaj nowe osoby.\n"); //druga operacja do wyboru
}
printf("3. Zamknij program.\nCo chcesz zrobić? Wpisz 1, 2 lub 3: "); //trzecia operacja do wyboru
fgets(&operation, sizeof(char), stdin); //wybór operacji przez użytkownika
switch (operation) //operacja 1 lub 2 wybrana przez użytkownika
{
case '1':
if (descSorting == 0)
{
descSorting = 1;
}
else
{
descSorting = 0;
}
SortAndDisplay(descSorting);
break;
case '2':
Add();
SortAndDisplay(descSorting);
}
}
while (operation != '3'); //operacja 3 wybrana przez użytkownika
return 0;
}
void Add(void) //dodaje nowe osoby
{
int i; //deklaracja zmiennej pomocniczej dla pętli
for(i=0; i<30; i++)
{
if (lista[i].data_ur.dzien > 0)
{
continue;
}
puts("\nDODAWANIE NOWEJ OSOBY\nZnak \"=\" kończy dodawanie"); //opis przed dodawaniem
if (GetText("Imię", 12, lista[i].imie) == 0 || GetText("Nazwisko", 30, lista[i].nazwisko) == 0 || GetDate(i) == 0)
{
return;
}
}
puts("\nDodano 30 osób, nie można dodawać więcej\n"); //komunikat, gdy dodano 30 osób
}
int GetText(char description[], int max, char target[max]) //pobiera informacje tekstową od użytkownika
{
char temp[max]; //deklaracja tablicy znakowej, do której będzie przypisana tymczasowo wartość
int j; //deklaracja zmiennej pomocniczej dla pętli sprawdzania czy tekst zawiera znak "="
int i; //deklaracja zmiennych liczbowych: pomocniczej dla pętli przypisywania
printf("%s (max %i znaków): ", description, max - 1); //wyświetl opis co trzeba wpisać
fgets(temp, sizeof temp, stdin); //pobierz linie tekstu
for(j=0; j<max-1; j++)
{
if (temp[j] == '=') //jeśli tekst zawiera znak "="
{
return 0; //zawiera znak "="
}
}
for (i=0; i<max-1; i++) //przypisanie liter do wyjściowej tablicy
{
target[i] = temp[i];
}
return 1;
}
(...)
Mam problem z funkcją "fgets".
"fgets(temp, sizeof temp, stdin);" (funkcja GetText) nie działa dla pobierania imienia dla każdej kolejnej osoby oprócz pierwszej, zamiast tego jest wyświetlenie "Imię (max 11 znaków): Nazwisko (max 29 znaków): " i pobieranie nazwiska.
"fgets(&operation, sizeof(char), stdin);" (funkcja "main") nie działa wcale, po wpisaniu "=" w miejsce imienia lub nazwiska albo innego znaku niż liczba w miejsce daty urodzenia, występuje pętla w nieskończoność z wypisywaniem:
"1. Sortuj według daty malejąco.
2. Dodaj nowe osoby.
3. Zamknij program.
Co chcesz zrobić? Wpisz 1, 2 lub 3:".
"gets" działało lepiej, ale chciałem tak zmienić, żeby po wpisaniu przez użytkownika za dużo znaków, program się nie wyłączał i nie pojawiała się informacja o wirusie. Program kompilowany za pomocą MiniGW x64 na Windows Server 2008 x64.
Dlaczego "fgets" nie pobiera imienia i numeru operacji do wykonania? Jak rozwiązać ten problem.