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

  • Regulamin

  • Szukaj

  • Użytkownicy

  • Kalendarz

  • Pomoc

  • Kontakt

  •  
Aktualny czas: 15-11-2019, 11:49 Witaj! (LogowanieRejestracja)
Witamy na WebElite.pl - Forum Informatycznym!

Aktualnie przeglądasz forum jako Gość, przez co Twój dostęp jest w pewnym stopniu ograniczony. Zarejestruj się a uzyskasz dostęp do publikacji postów oraz wielu innych ciekawych funkcji niedostępnych dla niezarejestrowanych użytkowników. Nie zastanawiaj się dłużej i dołącz do naszej społeczności już dziś!

Pozdrawiamy i życzymy mile spędzonego czasu na forum.
facebooktwitteryoutube
Rozpocznij wątek  Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
[C]Niedziałanie funkcji "fgets"
Autor Wiadomość
szmitek Offline
Newbie
*

Liczba postów: 2
Reputacja: - 0 +
Post: #1
[C]Niedziałanie funkcji "fgets"

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.
09-12-2008 22:03
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Support
jarex_67 Offline
Znawca
***

Liczba postów: 90
Reputacja: - 0 +
Post: #2
RE: [C]Niedziałanie funkcji "fgets"

Spróbuj tutaj jest fajne szkolenie || Link widoczny tylko dla zarejestrowanych. Zarejestruj się lub zaloguj. || Smile
29-08-2017 18:43
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Rozpocznij wątek  Odpowiedz 


Skocz do: