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

Struktury i problem ze "scanf"

Object Storage Arubacloud
0 głosów
655 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 Mędrzec (154,860 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ź 690 wizyt
pytanie zadane 3 maja 2020 w C i C++ przez reken Początkujący (390 p.)
+1 głos
1 odpowiedź 259 wizyt
pytanie zadane 16 kwietnia 2019 w C i C++ przez Neeq Obywatel (1,930 p.)
0 głosów
0 odpowiedzi 1,045 wizyt
pytanie zadane 8 stycznia 2018 w C i C++ przez BigBuzz Nowicjusz (180 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...