W celu zapewnienia prawidłowego funkcjonowania, forum WebElite.pl wykorzystuje pliki cookies. Zmiany ich ustawień możesz dokonać w opcjach konfiguracyjnych swojej przeglądarki.
Forum Informatyczne WebElite.pl
[C]Niedziałanie funkcji "fgets" - Wersja do druku

+- Forum Informatyczne WebElite.pl (http://www.webelite.pl)
+-- Dział: # Technika komputerowa (/forumdisplay.php?fid=10)
+--- Dział: Programowanie (/forumdisplay.php?fid=35)
+---- Dział: C/C++ (/forumdisplay.php?fid=81)
+---- Wątek: [C]Niedziałanie funkcji "fgets" (/showthread.php?tid=1496)



[C]Niedziałanie funkcji "fgets" - szmitek - 09-12-2008 22:03

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.


RE: [C]Niedziałanie funkcji "fgets" - jarex_67 - 29-08-2017 18:43

Spróbuj tutaj jest fajne szkolenie || Link widoczny tylko dla zarejestrowanych. Zarejestruj się lub zaloguj. || Smile