Diskuze: funkce scanf
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 14 zpráv z 14.
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.


Pokud chceš, aby program načetl jak číslice tak i rozpoznal to co bylo zadáno, je třeba důkladné analýzy. Na to Ti samotná funkce scanf() nestačí. Nejlepším řešením je načíst vstup jako řetězec pomocí fgets() a provést důkladný rozbor celého řetězce. Na základě tohoto rozboru můžeš buďto uživatele nechat opakovat zadání vstupu, nebo být trochu benevolentní a vstup si z celého řetězce vyextrahovat. Přílišná benevolence však není úplně na místě. Funkce scanf() Ti umožňuje buďto definovat svoji znakovou sadu nebo je schopna potlačit vstup. Takže pokud chceš, aby Ti funkce načetla čísla např. z následujících vstupů? [1,2] nebo (1,2) nebo {1,2}, můžeš potlačit ty znaky, které tam nechceš mít.
scanf("%*c%d%*c%d%*c", &x, &y);
To však Ti nezaručí, že uživatel zadá vstup dle tvých představ. Pokud to chceš v tomto stavu, použij to a otestuj návratovou hodnotu funkce scanf() na počet hodnot které načítáš. Pokud To nebude sedět, opakuj zadání vstupu.
Pokud chceš provádět nějaké úpravy na vstupu, využij fgets() k načtení vstupu, proveď úpravy v poli do kterého řetězec načítáš a nakonec použij sscanf() pro načtení vstupu z řetězce. Získat hodnoty a uložit si je do proměnných můžeš samozřejmě provést i v části určené úpravám.
Že já mám za problém pořádně načíst ty vstupy po nás ve škole
požadují, aby program poznal, jestli zadáváme strany trojúhelníka, nebo
jeho body.
Problém ale je, že to program má poznat podle vstupu:
Bud můžu teda zadat body npř: {[5;2], [6;3],[7;8]} a nebo jeho strany npr:
{20,30,40}
Ale problém mám v tom, že nevím jak to mám zjistit vše najednou, že
jednotlivě by to bylo nějak takto:
pocet = (scanf("{[%lf; %lf ], [%lf;%lf], [ %lf ; %lf ] }", &a,&b,&c,&d,&e,&f));
pocet = (scanf("{%lf, %lf, %lf}", &a,&b,&c));
printf("%d", pocet);
Jen nevím jak to mám spojit
Samozřejmě že to funguje, jen je to třeba řádně opsat. Měl bys vidět, že v řídícím řetězci používám dva aktivní specifikátory formátu, tak je třeba udělat to, aby počet dalších argumentů byl roven dvěma a ne šesti. Když si vyzkoušíš následující program, přesvědčíš se. Stačí to jen zkopírovat.
#include <stdio.h>
int main(void) {
int x, y;
printf("Zadej souradnici ve tvaru [X,Y]: ");
scanf("%*c%d%*c%d%*c", &x, &y);
printf("x=%d, y=%d\n", x, y);
return 0;
}
nj to je hezký ale asi si nepochopil ten můj problém 
já právě potřebuji, abych do mého programu mohl zadat tohle:
{[5;10]}
ale zároven i tohle:
{ 10 , 15 }
a to v tom tvém kodu nejde 
ale díky za radu 
Upřímně pochybuji, že Vás budou ve škole učit něco pokročilejšího než-li funkci scanf(). Tak to vyřeš následujícím způsobem. Zadej výzvu, dle které které má uživatel zadat vstup, něco ve smyslu následujícího:
printf("Chcete vyjádřit trojúhelník pomocí bodů nebo stran?\n");
printf("Zadejte b - pomocí bodů, s - pomocí stran\n\n");
choice = getchar();
if(choice=='b') // zde formát načtení pomocí bodů
else if(choice=='s') // zde formát načtení pomocí stran
else // zde neznámá volba
// ...
Tak ako má vyzerať korektný vstup? Stačí takto {[5;10]} resp {5,10} alebo treba vždy aby boli zadané všetky tri body/strany?
Nerobievam v C preto upozorňujem, že toto asi nie
je korektné, ale pred tým než niekto iný pomôže alebo než by som
to začal ručne parsovať
môžeš skúsiť toto
int main() {
char s[255];
double a, b, c, d, e, f;
fgets(s, 255, stdin);
if (sscanf(s, "{[%lf;%lf],[%lf;%lf],[%lf;%lf]}", &a, &b, &c, &d, &e, &f) == 6) {
printf("Zadal som body: %f %f %f %f %f %f\n", a, b, c, d, e, f);
}
if (sscanf(s, "{%lf,%lf,%lf}", &a, &b, &c) == 3) {
printf("Zadal som strany: %f %f %f\n", a, b, c);
}
getchar(); getchar();
return 0;
}
prípade môžeš použiť knižnicu regex.h?
Ako nechce sa mi v tom veľmi pokračovať pretože sa mi to nepáči, ale
ako rýchlu pomoc môžeš skúsiť takto 
Ignorovať nové riadky a medzery a ukončiť čítanie ak je zadaná
}
#include <stdio.h>
#include <stdlib.h>
#define BUFF_SIZE 255
int main() {
char buffer[BUFF_SIZE];
double a, b, c, d, e, f;
int i = 0, tmp;
while (1) {
tmp = fgetc(stdin);
if (tmp == '\n' || tmp == ' ') {
continue;
}
//nech neskoncime mimo vyhradenej pamate
if (i + 2 == BUFF_SIZE) {
buffer[i + 1] = '\0';
break;
}
buffer[i] = tmp;
i++;
if (tmp == '}') {
buffer[i] = '\0';
break;
}
}
if (sscanf(buffer, "{[%lf;%lf],[%lf;%lf],[%lf;%lf]}", &a, &b, &c, &d, &e, &f) == 6) {
printf("Zadal som body: %f %f %f %f %f %f\n", a, b, c, d, e, f);
}
if (sscanf(buffer, "{%lf,%lf,%lf}", &a, &b, &c) == 3) {
printf("Zadal som strany: %f %f %f\n", a, b, c);
}
getchar(); getchar();
return 0;
}
Zobrazeno 14 zpráv z 14.