Diskuze: Nekonečná smyčka
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 4 zpráv z 4.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
scanf v tomto případě nedovede naparsovat vstup, proto nechá stdin neflushnutý, čili v dalši iteraci mu příjde ten samý vstup. Řešením by bylo testovat vrácenou hodnotu na 0 a případně flushnout stdin pomocí funkce fflush.
if(scanf("%d", &eur) == 1)
{
printf("Je to %f korun\n", eur * 26.5);
}
else
{
printf("Neplatny znak\n");
while((getchar())!='\n');
}
Jde o to, že máš nějaký buffer v pozadí a z něj bereš data. Jestliže máš v bufferu třeba "x123", tak se pořád snaží najít číslo, ale to tam není. Takže ti jen vrátí, že tam číslo není, ale to 'x' tam pořád zůstane.
/* Prevod EUR/CZK */
#define _CRT_SECURE_NO_WARNINGS
#include <conio.h> // _getch()
#include <ctype.h> // isdigit()
#include <stdio.h> // printf(), putchar()
#include <stdlib.h> // atof()
int main(int argc, char *argv[]){
char eur[11] = ""; // castka v EUR
unsigned char c; // cislice tvorici castku v EUR
int done = 0; // status hlavni smycky programu (0 - beh, 1 - konec)
int pos = 0; // pozice v retezci castky v EUR
const double kurz = 26.5; // kurz EUR/CZK
printf("Prevod EUR/CZK\n\n");
while (!done) {
printf("Zadejte kolik mate EUR: ");
do {
c = _getch();
if (isdigit(c)) {
if (pos < 10) {
putchar(c);
eur[pos] = c;
pos++;
}
}
} while ((c != '\r')||(!pos));
eur[pos] = '\0';
printf("\n%s EUR = %.2f CZK\n\n", eur, atof(eur) * kurz);
printf("Chcete pokracovat\? [a/n]: ");
do {
c = _getch();
} while ((c != 'a') && (c != 'n'));
putchar(c);
if (c == 'a') pos = 0;
else done = 1;
printf("\n\n");
}
return 0;
}
Ono použití funkce scanf() je samo o sobě dost nešťastné řešení. Programátor má velmi malou kontrolu nad tím jak ošetřit chyby na vstupu. Funkce je v knížkách uváděna zejména pro svoji jednoduchost. Každý program je ale jiný, což si vyžaduje individuální přístup k danému řešení. Problem se dá řešit mnoha způsoby. Funkce scanf() nabízí možnost určit sadu zpracovávaných znaků, dokonce umožňuje omezit maximální délku řetězce přiřazeného do jejího argumentu a pak aplikovat funkce ze standardní knihovny jazyka C. Nebo využít vhodnější funkci pro práci s řetězci funkci gets(). Ale ani ona sama bez použití dalších funkcí řešení nenabízí. Není ale nic snazšího než si načtení čísla s kontrolou ošetření chyb naprogramovat sám. viz kód.
PS: Ještě jedna věc, pozor na českou diakritiku v kódu. Bez určení znakové sady se nebudou znaky vypisovat správně.
Zobrazeno 4 zpráv z 4.
