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

Struktury i problem ze "scanf"

42 Warsaw Coding Academy
0 głosów
898 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 (155,180 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ź 1,036 wizyt
pytanie zadane 3 maja 2020 w C i C++ przez reken Początkujący (390 p.)
+1 głos
1 odpowiedź 453 wizyt
pytanie zadane 16 kwietnia 2019 w C i C++ przez Neeq Obywatel (1,930 p.)
0 głosów
0 odpowiedzi 1,227 wizyt
pytanie zadane 8 stycznia 2018 w C i C++ przez BigBuzz Nowicjusz (180 p.)

93,377 zapytań

142,380 odpowiedzi

322,529 komentarzy

62,727 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...