Body zdarma Java týden
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!
Avatar
Šimon Cmar
Člen
Avatar
Šimon Cmar:20. dubna 19:12

Problém najlepšie pochopíte pri spustení programu. Aby som to v skratke opísal tak pri načítavaní údajov do štruktúry prvé načítavanie prebehne v poriadku a pri druhom už nastane problem.

Zkusil jsem: Chybu sa mi už podarilo odstrániť nahradením gets() za scanf("%[\n]c",­....).

Chci docílit: Chcem sa dozvedieť aká chyba tam nastáva a prečo keďže sa mi to stáva vo viacerých programoch a brzdí ma to.
Prikladám zdroják:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char meno[50];
char ulica[50];
int vek;

}UZIVATEL;

int main()
{
UZIVATEL uzivatelia[2];

for (int i=0;i<2;i++)
{
printf("Zadaj meno: ");
gets(uzivateli­a[i].meno);
printf("Zadaj ulicu: ");
gets(uzivateli­a[i].ulica);
printf("Zadaj vek: ");
scanf(" %d",&uzivateli­a[i].vek);
}
for (int i=0;i<2;i++)
{
printf("Uzivatel na indexe %d. \n",i);
printf("Meno: %s\n ",uzivatelia[i]­.meno);
printf("Ulica: %s \n",uzivateli­a[i].ulica);
printf("Vek: %d \n",uzivateli­a[i].vek);
}

return 0;
}

 
Odpovědět 20. dubna 19:12
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Šimon Cmar
DarkCoder:20. dubna 23:43

Chyba vzniká tím že po načtení hodnoty Ti ve vstupním bufferu zůstává znak odřádkování '/n', který je následně načten další vstupní funkcí a dochází tak k přeskočení načtení následné hodnoty.

A teď postupně k jednotlivým částem programu:

Knihovny stdlib.h a string.h vkládáš zbytečně, nevyužíváš nic z těchto knihoven. Jediná knihovna využitá v programu je stdio.h.

Pokud v programu používáš konstantu na vícero místech, je dobré si tuto konstantu definovat pomocí klíčového slova const nebo pomocí direktivy preprocesoru #define. Vyhneš se tak mnoha nepříjemnostem a ušetříš dost času v případném ladění.

Pokud program nevyužívá argumentu příkazového řádku, používej klíčové slovo void.

Funkce gets() je zastaralá a už není překladači podporována. Místo toho se používá její obecná varianta fgets(), která je bezpečnější, neboť obsahuje ochranu přetečení (druhý parametr). Pro načtení z konzole se používá stream stdin (třetí parametr). Dále je třeba myslet na to, že funkce fgets() načítá i znak nového řádku. Tento znak můžeš buďto odstranit nebo ho tam nechat a počítat s ním při výpisu (již znovu neodřádkovávat).

Mezi jednotlivými vstupními funkcemi je nutné vyprazdňovat vstupní buffer, jinak budou zbylé znaky, které se v něm nacházejí, aplikovány pro další vstupní funkci (chyba programu).

Např.

fseek(stdin, 0L, SEEK_END);

Téměř všechna identifikátory uzivatelia[i] jsou chybné (obsahují v sobě smetí u druhého písmene "i"). je nutné je všechny smazat a znova napsat (nekopírovat).

Nahoru Odpovědět 20. dubna 23:43
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
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 2 zpráv z 2.