NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Lukáš Bobka:7.2.2018 0:46

Zdravím,
chtěl bych vás poprosit o radu ohledně struktury. Udělal jsem uplně jednoduchou pro vyzkoušení, ale jestliže zadám data tak mi to celý padne. je tam problem s tim načítáním "scanf"... Nevím co s tím. Předem děkuju za názory.

typedef struct osoba {

        char jmeno[20];
        char primeni[20];
        int vek;
        char sex;

}OSOBA;

OSOBA list[2];


int main()
{

        for (int i = 0; i < 2; i++) {
                scanf_s("%s%s%d%c", list->jmeno, list->primeni, list->vek, list->sex);
        }
        printf("osoby jsou zadane");

        printf("vypis");

        for (int i = 0; i < 2; i++) {
                printf("Jmeno: %s,\tPrimeni: %s,\tVek: %d,\tPohlavy: %c\n");
        }

    return 0;
}
 
Odpovědět
7.2.2018 0:46
Avatar
Petr
Člen
Avatar
Petr:7.2.2018 3:00

Jako prvni problem bych videl ze nedefinujes ke ktere polozce pole list pristupujes, za dalsi list[i] neni ukazatel takze operator -> tam nema co delat a za treti scanf pokud vim zere ukazatele, tzn melo by to byt nejak takto? &(list[i].jmeno). Taky pocitej s tim ze kdyz ti tam nekdo zada retezec delsi jak 20 znaku tak ti to pujde do kytek, protoze ti to pretece, v lepsim pripade ti to prepise dalsi prvky te struktury, v horsim to pretece nekam dal a padne ti to jako ted.
Abych pravdu rekl, taky si nejsem jisty jak se to bude chovat v cecku sem nenapsal ani carku uz tak 8 let :)
Jo a pak v tom poslednim printf ti chybi promenne ktere chces vypsat :)

 
Nahoru Odpovědět
7.2.2018 3:00
Avatar
Petr
Člen
Avatar
Odpovídá na Petr
Petr:7.2.2018 3:08

Kecam blbosti, spis takto: list[i].jmeno, list[i].prijmeni, &(list[i].vek), &(list[i].sex)
jmeno a prijmeni uz jsou ukazatele

 
Nahoru Odpovědět
7.2.2018 3:08
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Bobka
DarkCoder:7.2.2018 7:52
  1. Chybí vložení hlavičkového souboru stdio.h (direktiva preprocesoru #include).
  2. Pro velikost pole vytvoř identifikátor (direktiva preprocesoru #define), vytvořený identifikátor používej v cyklech.
  3. Pokud funkce main() nemá parametry, používej klíčové slovo void.
  4. Pokud překládáš program jako .c nikoli .cpp, nedefinuj proměnnou uvnitř cyklu.
  5. Pokud používáš šipkový operátor, musíš mít deklarovanou ukazatelovou proměnnou a tomuto ukazateli musíš mít přiřazenu adresu struktury. Chceš-li přistupovat ke struktuře přímo, používej tečkový operátor.
  6. Ve funkci scanf() chybí adresový operátor &.
  7. Výpisy odděluj, používej '\n'.
  8. Funkci printf() voláš s nesprávným počtem parametrů.
  9. Pohlavi.
  10. Ujistit se, že nepřekračuješ meze prvků struktury.
Nahoru Odpovědět
7.2.2018 7:52
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Lukáš Bobka:7.2.2018 18:57

Zdravím vás, a moc děkuju za postřehy. Udělal jsem to dle vašich doporučení ale stejně mi to nejde.Nebo jako "jde". Nechápu jak je to možne. Jestliže jsem toto napsal ve M. visualu nerozchodil jsem to neustále mi vyskakuje error(při načítání prvního). Ale když jsem použil DEV C++ tak se mi to přeložilo a funguje. Nechápu a nevím kde je chyba?
Zdroják fungujíci z DEV C++:

#include <stdio.h>
#include <string.h>

#define MAX 2

typedef struct osoba {

        char jmeno[20];
        char primeni[20];
        int vek;
        char sex;

}OSOBA;

OSOBA list[MAX];

int main()
{
        int i;
        printf("Zadej / Jmeno /Primeni / vek / pohlavi \n");
        for (i = 0; i < MAX; i++) {
                scanf("%s %s %d %c", list[i].jmeno, list[i].primeni, &list[i].vek, &list[i].sex);
        }
        printf("osoby jsou zadane\n");

        printf("vypis\n");

        //celkovy vypis
        for (i = 0; i < MAX; i++) {
                printf("Jmeno: %s,\tPrimeni: %s,\tVek: %d,\tPohlavy: %c\n",
                                        list[i].jmeno, list[i].primeni, list[i].vek, list[i].sex);
        }

}
 
Nahoru Odpovědět
7.2.2018 18:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.