Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Chyba pri načítavani.

Aktivity
Avatar
Šimon Cmar
Člen
Avatar
Šimon Cmar:20.4.2019 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.4.2019 19:12
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Šimon Cmar
DarkCoder:20.4.2019 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.4.2019 23:43
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
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.