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?