• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Struktury i problem ze "scanf"

0 głosów
215 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

Cześć 

Mam problem z następującym zadaniem bazującym na strukturach:

Zadanie 4.2
4. Struktury
2. Ech, Ci Studenci
 Treść
 Pliki
 Historia
 Pomoc
Termin
Trudność
 2020-05-31
zostało 61 dni
Punkty: 1
Próba
-
Ocena maszyny
    
Czas testu: 16sek
Inspekcja kodu
   
Plagiat
    
Raporty
Napisz program do parsowania i przechowywania danych studenta w postaci imienia, nazwiska oraz numeru albumu.

W tym celu przygotuj strukturę, pozwalającą na przechowywanie danych o studencie. Struktura powinna posiadać pola do przechowywania imienia studenta, jego nazwiska (w formie tekstowej) oraz jego numeru indeksu (w formie liczby całkowitej typu int). Struktura ma wyglądać następująco:

struct student_t
{
    char name[20];
    char surname[40];
    int index;
};
Ponadto przygotuj funkcje pozwalające na: pobieranie danych studenta od użytkownika oraz na wyświetlanie informacji zawartych w strukturze. Prototypy tych funkcji powinny wyglądać następująco:

struct student_t* read(struct student_t* p, int *err_code);
void show(const struct student_t* p);
Funkcja read:

W funkcji read dane będą wprowadzane przez użytkownika po przecinku, zgodnie z następującym wzorcem:

imię, nazwisko, numer indeksu
Wczytując dane, pamiętaj o usunięciu zbędnych spacji na początku i końcu wprowadzanego wiersza. Aby uznać imię oraz nazwisko za istniejące w tekście podanym z klawiatury, muszą po nich następować przecinki.

Parametry:

p - funkcja powinny przyjąć na wejściu wskaźnik p do struktury student_t, do której ma zapisać wprowadzone przez użytkownika.
err_code - wskaźnik na zmienną przechowującą kod błędu. Wartość NULL oznacza, że wywołujący nie jest zainteresowany kodem błedu.
Kody błędów:

0 - wszystkie dane wczytane poprawnie (sukces)
1 - brak poprawnie wczytanych danych do struktury (na przykład brak przecinków we wprowadzonym tekście) lub brak wskaźnika na strukturę student_t,
2 - poprawnie wczytano jedynie imię,
3 - poprawnie wczytano jedynie imię oraz nazwisko.
Wartość zwracana:

Funkcja zwraca wskaźnik p w przypadku sukcesu lub
NULL wprzypadku błedu.
Funkcja show:

Funkcja show wyświetla dane studenta, przekazane wskaźnikiem p zgodnie z następującym wzorcem (zwróć uwagę na przecinki):

imię nazwisko, numer indeksu
W przypadku otrzymania NULL w parametrze powinna zaniechać jakichkolwiek akcji.

Napisz program pozwalający na wczytanie z klawiatury danych studenta: imienia, nazwiska oraz indeksu do struktury student_t. Wprowadzone dane wyświetl w konsoli używając przygotowanych przez siebie funkcji.

W przypadku podania błędnych danych program powinien wyświetlić komunikat Incorrect input oraz zwrócić wartość kodu błędu, wygenerowanego przez funkcję read.

Przykład interakcji z programem -- sukces:

Podaj dane: ⏎
Victor, McLaglen, 206207⏎
Victor McLaglen, 206207
Przykład interkacji z programem -- błędy danych wejściowych:

Podaj dane: ⏎
Henry Fonda 205874⏎
Incorrect input
Podaj dane: ⏎
Ben, Stiller⏎
Incorrect input
Podaj dane: ⏎
Cuba, GoodingJr.GoodingJr.GoodingJr.GoodingJr. 194005⏎
Incorrect input
Uwaga

W programie nie wolno korzystać z tablic (za wyjątkiem deklaracji struktury),
W programie nie wolno dynamicznie alokować pamięci.

Rozpisałem więc kod:

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

struct student_t
{
    char name[20];
    char surname[40];
    int index;
};


struct student_t* read(struct student_t* p, int *err_code);
void show(const struct student_t* p);


int main()
{
    struct student_t mine; // struktura, w której będą przechowywane nasze informacje.
    struct student_t * pointer=&mine; // przypisaniee do wskaźnika struktury
    int wynik_bledu; 
    int *pointer_on_error=&wynik_bledu; // wskaznik na zmiennna wynik_bledu
    struct student_t wynik_z_funkcji_strukturalnej;
    struct student_t * pointer_on_wynik_z_funkcji_strukturalnej=&wynik_z_funkcji_strukturalnej;



    printf("Podaj dane: ");
    pointer_on_wynik_z_funkcji_strukturalnej=read(pointer,pointer_on_error);
    if(*pointer_on_error==1 || *pointer_on_error==2 || *pointer_on_error==3)
    {
        printf("Incorrect input");
        return *pointer_on_error;
    }


    const struct student_t * pointer_on_mine=&mine; //
    show(pointer_on_mine);

    return 0;
}
struct student_t* read(struct student_t* p, int *err_code)
{
    if(p==NULL || err_code==NULL)
    {
        *err_code=1;
    }
    int wynik_scanf=0;
    wynik_scanf=scanf(" %20[^,], %40[^,], %d ", (*p).name ,(*p).surname,(*p).index );
    //printf("\nJestem tutaj!\n");
    //printf("%s, %s, %d",(*p).name,(*p).surname,(*p).index);
    if(wynik_scanf == 1)
    {
        *err_code=2;
    }
    if(wynik_scanf == 2)
    {
        *err_code=3;
    }
    return p;
}
void show(const struct student_t* p)
{
    if(p==NULL)
    {
        return;
    }
    printf("%s %s, %d",(*p).name,(*p).surname,(*p).index);
}

Zauważyłem, że problem w moim kodzie znajduje się w następującej linijce:

wynik_scanf=scanf(" %20[^,], %40[^,], %d ", (*p).name ,(*p).surname,(*p).index );

Przy przejściu do podawania danych cały program się wypisuje. Jak za pomocą scanf-a z uwzględnieniem przecinków mogą wczytać dane do zmiennych w mojej strukturze?

1 odpowiedź

0 głosów
odpowiedź 1 kwietnia 2020 przez tangarr VIP (136,500 p.)
wybrane 3 kwietnia 2020 przez Hubertius
 
Najlepsza

Źle przekazałeś zmienną index (przekazałeś wartość zamiast adresu).
Proponuję zostawić 1 bajt na znak końca łańcucha w zmiennych name i surname.

wynik_scanf=scanf("%19[^,], %39[^,], %d", (*p).name ,(*p).surname, &(*p).index );

 

Podobne pytania

0 głosów
1 odpowiedź 232 wizyt
pytanie zadane 3 maja 2020 w C i C++ przez reken Początkujący (390 p.)
+1 głos
1 odpowiedź 82 wizyt
pytanie zadane 16 kwietnia 2019 w C i C++ przez Neeq Obywatel (1,930 p.)
0 głosów
0 odpowiedzi 659 wizyt
pytanie zadane 8 stycznia 2018 w C i C++ przez BigBuzz Nowicjusz (180 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

84,130 zapytań

132,899 odpowiedzi

293,918 komentarzy

55,554 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...