abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 14:44 | Komunita

Mozilla.cz informuje, že Firefox bude možná upozorňovat na úniky vašich hesel. V Mozille prototypují upozorňování na únik informací o vašem účtu, pokud se na seznamu Have I been pwned? objeví služba, ke které máte ve Firefoxu uložené přihlašovací údaje. Informace se objevila v pravidelném newsletteru o vývoji Firefoxu.

Ladislav Hagara | Komentářů: 4
dnes 00:22 | Bezpečnostní upozornění

Společnost ZONER informuje o bezpečnostním incidentu, při kterém došlo ke zcizení a zveřejnění části přihlašovacích údajů zákazníků k elektronické poště a webhostingu CZECHIA.COM.

Ladislav Hagara | Komentářů: 0
včera 23:44 | Nová verze

Byla vydána nová stabilní verze 1.13 (1.13.1008.32) webového prohlížeče Vivaldi (Wikipedie). Z novinek vývojáři zdůrazňují možnost zobrazení otevřených i uzavřených listů pomocí ikonky Okno na postranní liště a vylepšené stahování (YouTube). Nejnovější Vivaldi je postaveno na Chromiu 62.0.3202.97.

Ladislav Hagara | Komentářů: 8
včera 20:55 | Nová verze

Byla vydána verze 2017.3 dnes již průběžně aktualizované linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux. Aktualizovat systém lze pomocí příkazů "apt update; apt dist-upgrade; reboot". Z novinek lze zmínit 4 nové nástroje: InSpy, CherryTree, Sublist3r a OSRFramework.

Ladislav Hagara | Komentářů: 1
včera 01:55 | Bezpečnostní upozornění

Společnost Uber potvrdila bezpečnostní incident a únik dat v roce 2016. Unikly údaje o 57 milionech cestujících (jména, emailové adresy a čísla mobilních telefonů) a 600 tisících řidičích (navíc čísla řidičských průkazů).

Ladislav Hagara | Komentářů: 1
21.11. 23:44 | Humor

Co vypíše příkaz man půl hodiny po půlnoci? Text "gimme gimme gimme". Jedná se o virtuální velikonoční vajíčko připomínající skupinu ABBA a její hit Gimme! Gimme! Gimme! (A Man After Midnight). Problém nastane, pokud gimme gimme gimme nabourá automatizované testování softwaru. To se pak příkaz man musí opravit [Bug 1515352] [reddit].

Ladislav Hagara | Komentářů: 10
21.11. 18:11 | Zajímavý článek

Mozilla.cz informuje, že Firefox na Fedoře podporuje Client Side Decorations. Firefox na Linuxu se vykresluje včetně standardního záhlaví okna, které je v případě webového prohlížeče většinou nadbytečné a ubírá drahocenné vertikální místo na obrazovce. Verze distribuovaná uživatelům Fedory však nyní obsahuje experimentální podporu pro takzvané Client Side Decorations, které umožňují vykreslování „oušek“ panelů do záhlaví okna.

Ladislav Hagara | Komentářů: 12
21.11. 05:00 | Bezpečnostní upozornění

Maxim Goryachy a Mark Ermolov ze společnosti Positive Technologies budou mít v prosinci na konferenci Black Hat Europe 2017 přednášku s názvem "Jak se nabourat do vypnutého počítače, a nebo jak v Intel Management Engine spustit vlastní nepodepsaný kód". O nalezeném bezpečnostním problému informovali společnost Intel. Ta bezpečnostní problém INTEL-SA-00086 v Intel Management Engine (ME), Intel Server Platform Services (SPS) a Intel

… více »
Ladislav Hagara | Komentářů: 43
21.11. 01:33 | Zajímavý projekt

Na Humble Bundle byla spuštěna akce Humble Book Bundle: Java. Za 1 dolar a více lze koupit 5 elektronických knih, za 8 dolarů a více 10 elektronických knih a za 15 dolarů a více 15 elektronických knih věnovaných programovacímu jazyku Java od nakladatelství O'Reilly. Peníze lze libovolně rozdělit mezi nakladatelství O'Reilly, neziskovou organizaci Code for America a Humble Bundle.

Ladislav Hagara | Komentářů: 0
21.11. 00:11 | Zajímavý projekt

Článek na OMG! Ubuntu! představuje rodinu písma IBM Plex. Jedná se o open source písmo (GitHub) navržené a uvolněné společností IBM (YouTube, Carbon Design System). Ukázka na Font Squirrel.

Ladislav Hagara | Komentářů: 14
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (9%)
 (1%)
 (1%)
 (1%)
 (75%)
 (14%)
Celkem 753 hlasů
 Komentářů: 37, poslední 21.11. 15:21
    Rozcestník

    Dotaz: Problem s fgets()

    30.8.2006 11:17 Josef
    Problem s fgets()
    Přečteno: 786×
    Dobry den, mam kod v jazyce C:
    #include <stdio.h>

    int main(int argc, char **argv) {

    char znaky[20];
    int a, b;
    scanf("%d", &a);

    fgets(znaky, 20, stdin);
    printf("%s", znaky);
    scanf("%d", &b);
    return 0;
    }
    Prekladal jsem to v Linuxu, problem je v tom, ze mi to po spusteni dovoli nacist pouze a, b. Proste mi to preskoci to fgets() a retezec si nemuzu nacist. Kdyz odmazu ty dva scanf() tak program funguje dle ocekavani - nacte z stdin retezec a opise jej na obrazovku, ale kdyz tam jsou ta dve volani scanf(), tak fgets() jako by to ani nevolalo.. Nevite, prosim, v cem je problem? Diky

    Odpovědi

    Martin Tůma avatar 30.8.2006 12:00 Martin Tůma | skóre: 38 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: Problem s fgets()

    Problém je v tom, že fgets() načte ten ENTER, co pravděpodobně zadáváš za tím prvním číslem(a) a do proměnné znaky se tak načte prázdný řetězec (viz man fgets)

    Každý má právo na můj názor!
    30.8.2006 13:32 rastos | skóre: 60 | blog: rastos
    Rozbalit Rozbalit vše Re: Problem s fgets()
    miesto
     scanf("%d", &a);
    skus
     scanf("%d\n", &a);
    15.10.2006 16:04 Pavel Zbytovský
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Ahoj, tvůj zápis mě navedl na řešení, ale rozhodně se to takto nechová očekávaně. Když zadáš scanf("%d\n", &a); tak se očekávaně načte první slovo na prvním řádku do ukazatele na pole znaků, ale stdin čeká po odentrování na další vstup, který se jakoby uloží do stdin a pokračuje se v programu, takže při zadání:
    scanf("%d", &cislo);
    printf("pomoci fgets() ulozime %d znaku: ", cislo);
    fgets(pch, cislo, stdin);
    
    se normálně zapíše integer do "cislo", po odentrování se zapíše řetezec do stdin, my vypíšeme hlášku, a teď na nic nečekáme, jen vybereme data z toho už zapsaného stdinu.

    Jediné řešení co mě napadlo, je připsat ještě jeden fgets, který by sežral ten enter a další by to už zpracovat dle očekávání. Tohle mi ale rozhodně nepřijde elegantní.

    Momentálně kompiluji pomocí lcc na Win platformě.
    stativ avatar 15.10.2006 16:13 stativ | skóre: 54 | blog: SlaNé roury
    Rozbalit Rozbalit vše Re: Problem s fgets()

    To je myslim normalni chovani, treba v C++ cin.get() taky nechava znak noveho radku ve vstupni fronte. Tohle pripsani jeste jednoho volani dotycne metody je zcela v poradku a ciste, jinak to resit nejde (opominu-li pouziti nejakeho jineho zpusobu nacitani, jako je napr. v C++ cin.getline)

    To same plati i pro jejich obdoby pro praci se soubory.

    Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
    15.10.2006 16:14 cronin | skóre: 49
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Neslo by citat retazec pomocou scanf("%s", ...)?
    15.10.2006 20:01 Pavel Zbytovský
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Jak kdy - scanf nám načte jen první slovo. fgets čte zadaný počet znaků, ale pro začátečníky jako já tu je ten problém s stdin-em.
    15.10.2006 16:20 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Problem s fgets()
    To chování je naprosto logické, uvědomte si, že dokud řádek vstupu neodešlete, máte pořád možnost ho editovat.
    15.10.2006 20:51 Pavel Zbytovský
    Rozbalit Rozbalit vše Re: Problem s fgets()
    No ano, to jsem si také neuvědomil. Už mi to díky vám všem chodí.

    Jen bych si shrnul myšlenky (kdyžtak mě prosím opravte):

    fgets(pCh, 2, stdin) načte ze stdinu řetezec o délce 2, tj. 1 znak, druhý je \0. Enter vytvoří \n, načítá se do prvního výskytu \n (musí se dát pozor,kdy zbyde odminule), podle očekávání bude poslední znak řetezce (vždy?) "\n" (ASCII=10);

    scanf("%15d", pCh2) načte ze stdinu všechno, co tam je, až po zmáčknutí Enteru. Trimne zleva případné zbytečné "\n", resp. všechny bílé znaky. V ukazateli na char dva bude první slovo (případně s maximálním počtem 15 znaků). Ale na rozdíl od fgets nechá v stdinu "\n";

    Tenhle příspěvek píšu už asi hodinu, postupně se tento dotaz vyvíjel za neustálého zkoušení od hloupého ke shrnutí, na co jsem přišel. Prosím vás, zkontrolujte mi to ať v tom mám jasno.
    Josef Kufner avatar 15.10.2006 16:35 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Obvykle když načítám něco z stdin nebo i odjinud, tak si načtu řádek pomocí fgets a pak si s ním dělám co je třeba (sscanf).
    Hello world ! Segmentation fault (core dumped)
    15.10.2006 20:57 Pavel Zbytovský
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Měl bych ještě dva dotazy, ale nehodily se k předchozímu vláknu.

    1. Lze nějak načíst znak nebo určený počet znaků do ničeho? Něco jako bych je poslal do /dev/null :-)

    2. Existuje nějaká funkce, která by umožnila načíst jeden nebo určený počet znaků bez odEnterování?

    Omlouvám se, že trošku spamuji tento dotaz, ale zdá se mi, že se to k načítání znaků docela hodí a navíc jsou v tomhle fóru profíci ;-)
    Josef Kufner avatar 15.10.2006 21:06 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Problem s fgets()
    ad 1.: fseek();

    ad 2.: fgets(); ungetc();
    Hello world ! Segmentation fault (core dumped)
    15.10.2006 21:13 Pavel Zbytovský
    Rozbalit Rozbalit vše Re: Problem s fgets()
    No jasně, díky moc!
    Josef Kufner avatar 15.10.2006 22:08 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Akorát na seek pozor, nefunguje vždy. Vlastně to funguje akorát na souborech, jinak asi nikde.
    Hello world ! Segmentation fault (core dumped)
    16.10.2006 14:59 Pavel Zbytovský
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Teď bohužel nemám čas to zkoušet, ale doufám že to funguje na stdinu, vždyť to je resource jako soubor, ne? Našel jsem totiž další issue - když do vstupu, při scanf zadám třeba pár mezer a text, potom [alt] + 10 (což je \n) a další text, tak scanf si ze stdinu sežere všechny bíle znaky zleva a "všechno" až do \n, přičemž do proměnné se uloží jen první slovo z toho "všechno".

    Když tedy zadáme "20", [alt] + 10, "bleble", [enter] - tak scanf nechá ve stdinu \n, "bleble", \n (za ten enter), tudíš by se hodil fseek, který by nám skočil až na konec a nemuselo by se to "hackovat" žraním \n, když tam toho stejně může zbýt více.
    16.10.2006 19:08 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Problem s fgets()

    A jak byste si konkrétně představoval takový seek na terminálu? Co by třeba podle vás měla provést třeba volání

      lseek(fd, 0, SEEK_SET);
      lseek(fd, 0, SEEK_END);
    

    Mne nic rozumného nenapadá.

    16.10.2006 19:34 zbycz | skóre: 5
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Možná mám nedostatek znalostí - s céčkem si tykám pár týdnů. Nevím co dělá lseek, ale představuji si, že při použití fseek(stdin, 0, SEEK_END) bych nemusel ošetřovat znaky, které tam zůstanou po scanfu a věděl bych, že fgets mi vrátí opravdu přesně to co chci po uživatelské vstupu.

    Moc děkuji všem za odpovědi :-)
    Josef Kufner avatar 16.10.2006 23:09 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Tak zrovna u stdin a ostatních to fungovat ani nemůže. Prostě není jak. Korektně to funguje opravdu jen u souborů, jakožto opravdu souborů. FILE* může mít i sítový soket nebo roura (jako je třeba stdin).
    Hello world ! Segmentation fault (core dumped)
    17.10.2006 09:29 zbycz | skóre: 5
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Hmm, tak to je docela hloupé. Asi jsem došel ke správnému výsledku špatným řešením? Nemohlo by to fungovat pouze na Win?

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    	int pocet_znaku=15;
    	char *pch;
    
    	printf("zadej pocet znaku: ");
    	scanf("%d", &pocet_znaku);
    	/*nejdriv se optame kolik bude chtit znaku*/
    
    	fseek(stdin, 0, SEEK_END);
    	/*vyžrání nejen odentrování ----- mě to funguje :-S*/
    
    	//char pchHack[2]; //nesmí být jedna - fgets zapisuje do řetezce->na konci \0
    	//fgets(pchHack, 2, stdin);
    	//printf("\n-> zbytek ve stdin: %d, %d <<-\n", pchHack[0], pchHack[1]);
    	/*vyžrání odentrování - na win platformách --- podle diskuse ABC*/
    
    	pch = (char *)malloc(pocet_znaku+1);
    	/*v pch máme zalokovaných tolik bajtů, kolik uživatel chtěl
       	  + jeden navíc pro ukončovací znak*/
    
    	printf("\npomoci fgets() ulozime %d znaku: ", pocet_znaku);
    
    	fgets(pch, pocet_znaku+1, stdin);
    	/*pocet_znaku-1 kvuli nule ukončující řetezec*/
    
    	printf("\n\nZadal jsi: %s", pch);
    
    	return 0;
    }
    
    17.10.2006 23:35 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Pokud použijete konstrukci s nedefinovaným chováním (a to seek na neseekovatelném deskriptoru je), vězte, že to nejhorší, co se vám může stát, je, že to bude dělat, co potřebujete. Protože to totiž znamená, že to může kdykoli bez výstrahy přestat fungovat, jakmile se cokoli ve vašem systému změní - a nebo dokonce i když se nic nezmění. A už vůbec nemůžete spoléhat na to, že to bude fungovat i jinde.
    16.10.2006 21:29 zbycz | skóre: 5
    Rozbalit Rozbalit vše Re: Problem s fgets()
    ad 1) celé vlákno je o kousek výše - zápis fseek(stdin, 0, SEEK_END) opravdu funguje výborně, když ho zavolám po scanfu, tak si vůbec nemusím lámat hlavu s tím co tam zůstalo. Jupí!

    (Není to nějak nečisté? Céčko píšu pár týdnu a někdo výše totiž psal, že čisté i elegantní - přestože možná ne uplně funkční - je to právě přes další fgets)

    ad 2) tak tohle mi nějak nefunguje - fgets() se musí po zapsání Enterovat a ungetc() podle všeho nečte, ale naopak zapisuje písmenko do bufferu.

    Ještě jednou tedy: rád bych funkci, která mi načte, asi rovnou z klávesnice jeden znak, bez následného zmáčknutí Enter. Přes stdin to zřejmě nelze (viz výše).
    Josef Kufner avatar 16.10.2006 23:12 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Problem s fgets()
    ad 2) eh asi jsem to myslel nějak jinak, ale už nevím jak :-D

    Pokud si nevystačíš se standardními funkcemi, podívej se na knihovnu ncurses.
    Hello world ! Segmentation fault (core dumped)
    Martin Tůma avatar 17.10.2006 00:11 Martin Tůma | skóre: 38 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: Problem s fgets()
    rád bych funkci, která mi načte, asi rovnou z klávesnice jeden znak, bez následného zmáčknutí Enter. Přes stdin to zřejmě nelze

    keypressed v C?

    Každý má právo na můj názor!
    17.10.2006 09:30 zbycz | skóre: 5
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Díky moc za odkaz, zdá se že se raději spokojím s Enterem :-D
    Josef Kufner avatar 18.10.2006 00:50 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Tak tohle má do hezkého celkem daleko. Pomocí select() lze dosáhnout elegantnější cestou téměř téhož (pokud jde o onu smyčku s čekáním a read). A na hraní si s terminálem je výhodnější využít ncurses, kde přepnutí na nebufferovaný vstup je otázkou zavolání jedné nebo dvou funkcí a přitom ncurses i select je prakticky všude.
    Hello world ! Segmentation fault (core dumped)
    Martin Tůma avatar 18.10.2006 03:26 Martin Tůma | skóre: 38 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Pomocí select() lze dosáhnout elegantnější cestou téměř téhož (pokud jde o onu smyčku s čekáním a read).

    Přečti si to celý a pořádně. Požadovaného efektu pomocí select() opravdu dosáhnout nelze. (Pokuď si teda pod slovem "skoro" nepředstavuješ vynechání nejpodstatnější části požadavku...)

    A na hraní si s terminálem je výhodnější využít ncurses, kde přepnutí na nebufferovaný vstup je otázkou zavolání jedné nebo dvou funkcí a přitom ncurses i select je prakticky všude

    Jenom kvůli tomuhle do systému zatahovat závislost na ncurses mi přijde dost zbytečný a s tím, že jsou prakticky všude bych si taky dovolil polemizovat...

    Každý má právo na můj názor!
    Josef Kufner avatar 18.10.2006 08:11 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Problem s fgets()
    Pomocí select() lze dosáhnout elegantnější cestou téměř téhož (pokud jde o onu smyčku s čekáním a read).

    Přečti si to celý a pořádně. Požadovaného efektu pomocí select() opravdu dosáhnout nelze. (Pokuď si teda pod slovem "skoro" nepředstavuješ vynechání nejpodstatnější části požadavku...)

    To jsem reagoval na ten cyklus ukázaný za odkazem, kde byl sleep, kontrola, zda data z stdin přišla a inkrement proměnné. Protože se to opravdu nastavení terminálu netýká a samo o sobě by to nebylo moc užitečné, napsal jsem i druhý odstavec ;-)
    Hello world ! Segmentation fault (core dumped)

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.