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í
×

včera 20:55 | Komunita

Od 18. do 21. května proběhla v Saint-Étienne Linux Audio Conference 2017. Na programu byla řada zajímavých přednášek a seminářů. Videozáznamy přednášek lze zhlédnout na YouTube. K dispozici jsou také články a prezentace.

Ladislav Hagara | Komentářů: 0
včera 20:44 | IT novinky

Hodnota Bitcoinu, decentralizované kryptoměny, překonala hranici 2 200 dolarů. Za posledních 30 dnů tak vzrostla přibližně o 80 % [reddit].

Ladislav Hagara | Komentářů: 0
včera 17:33 | Nová verze

Po 5 měsících vývoje od vydání verze 0.12.0 byla vydána verze 0.13.0 správce balíčků GNU Guix a na něm postavené systémové distribuce GuixSD (Guix System Distribution). Na vývoji se podílelo 83 vývojářů. Přibylo 840 nových balíčků. Jejich aktuální počet je 5 454. Aktualizována byla také dokumentace.

Ladislav Hagara | Komentářů: 1
včera 17:22 | Nová verze

Po 5 měsících vývoje a 3 týdnech intenzivního testování byla vydána verze 12 open source systému Nextcloud, forku ownCloudu, umožňujícího provoz vlastního cloudového úložiště. Přehled novinek i s videoukázkami v poznámkách k vydání. Pro vyzkoušení je k dispozici demo.

Ladislav Hagara | Komentářů: 2
včera 11:44 | Zajímavý článek

Týden po prvním číslu publikoval Michal Špaček na svých stránkách druhé číslo newsletteru věnovanému bezpečnosti, bezpečnému vývoji převážně webových aplikací a bezpečnosti uživatelů. Věnuje se výpadku Let's Encrypt, únikům dat, bug bounty pro WordPress nebo SQL Injection v Joomla. Zmiňuje také, že Mozilla plánuje z Firefoxu odstranit podporu pro Encrypted Media Extensions (EME) na nešifrovaném HTTP a nadále pro EME vyžadovat HTTPS.

Ladislav Hagara | Komentářů: 0
včera 02:00 | Pozvánky

Ve středu 31. května 2017 od 17:00 proběhne v pražské pobočce SUSE Den otevřených dveří v SUSE. Čekají vás přednášky o live kernel patchingu a nástroji SaltStack. Také se dozvíte zajímavé informace o SUSE, openSUSE, a vlastně všech produktech, na kterých lidé ze SUSE pracují.

Ladislav Hagara | Komentářů: 4
včera 01:00 | Pozvánky

Czech JBoss User Group srdečně zve na setkání JBUG v Brně, které se koná ve středu 7. června 2017 v prostorách Fakulty informatiky Masarykovy univerzity v místnosti A318 od 18:00. Přednáší Tomáš Livora na téma Fault Tolerance with Hystrix. Více informací na Facebooku a Twitteru #jbugcz.

mjedlick | Komentářů: 0
19.5. 23:22 | Zajímavý projekt

Na Texture Ninja je volně k dispozici více než 4 tisíce textur. Autora lze podpořit na Patreonu.

Ladislav Hagara | Komentářů: 0
19.5. 10:22 | Pozvánky

Mozilla.cz zve na MozBeer Prague #2. Druhé setkání Mozilla.cz proběhne 26. května od 18:00 v Praze v Diversion Bistru v ulici Mělnická.

Ladislav Hagara | Komentářů: 0
18.5. 23:22 | Bezpečnostní upozornění

Průvodce restauracemi Zomato, jenž v roce 2014 koupil Lunchtime.cz, potvrdil bezpečnostní problém. Odcizeno bylo 17 miliónů záznamů o uživatelích (jména, emailové adresy, osolené hashe).

Ladislav Hagara | Komentářů: 8
Chystáte se pořídit CPU AMD Ryzen?
 (6%)
 (33%)
 (1%)
 (8%)
 (44%)
 (9%)
Celkem 587 hlasů
 Komentářů: 62, poslední 19.5. 01:57
    Rozcestník

    Funkce strtol a nanosleep (jazyk C)

    28.3. 21:09 | Přečteno: 823× | Linux | poslední úprava: 28.3. 21:07

    Funkce strtol() se nachází v hlavičkovém souboru stdlib.h a je součástí standardní knihovny ANSI C.

    long int strtol(const char *str, char **endptr, int base)

    str je řetězec s číslem,

    endptr je zbývající nečíselná část. Takže pokud v str bude "25pes", endptr bude obsahovat "pes". Pokud o tuto koncovku nestojíme, můžeme endptr nastavit na NULL,

    base je číselná soustava, na výběr je soustava dvojková až šestatřicátá.

    Funkce strtol() vrací číselnou hodnotu převáděného řetězce. Dojde-li k přetečení nebo podtečení vrací symbolickou konstantu LONG_MAX, resp. LONG_MIN a zároveň je do proměnné errno přiřazena hodnota symbolické konstanty ERANGE.

    Funkce atol(), atoi() a atof() jsou zastaralé a nebezpečné, jelikož umožňují přetečení čísla.


    Funkce nanosleep() pozastaví spuštěný program. Funkce se nachází v hlavičkovém souboru time.h a není součástí standardní knihovny.
    int nanosleep(const struct timespec *req, struct timespec *rem)
    
    struct timespec {
    	time_t tv_sec;		/* sekundy */
    	long   tv_nsec;		/* nanosekundy */
    };
    Funkce nanosleep() při úspěšném proběhnutí vrací 0. Pokud se vyskytne chyba, funkce vrátí -1, proměnnou errno nastaví na jednu z možných symbolických konstant a v určitých případech zapíše zbývající čas do ukazatele rem, pokud není nastaven na NULL.

    Hodnota tv_nsec musí být mezi 0 a 999999999.

    (Nanosekunda je miliardtina sekundy.)

    Pokud se spokojíme s pauzou v rozmezí sekund, můžeme použít funkci sleep(), která se nachází v hlavičkovém souboru unistd.h, její použití je méně komplikované.
    sleep(5); 	/* pauza 5 sekund */

    Následuje ukázka, jak funkce strtol() a nanosleep() použít. Program načítá celá čísla z klávesnice. Číslo je načteno jako řetězec a převedeno na typ int long pomocí funkce strtol(). Funkce estrtol() kontroluje, zda řetězec s číslem neobsahuje nečíselné znaky, zda nedošlo k přetečení nebo podtečení a zda nebyl odentrován prázdný řetězec. Po stisknutí CTR-D funkce fgets() načte symbolickou konstantu EOF (end of line) a fgets() vrátí NULL, čímž se ukončí načítání z klávesnice. Program poté čísla srovná a každé číslo vypíše s půlsekundovou prodlevou.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <errno.h>
    #include <limits.h>
    
    enum {
    	MAXNUM = 100,	
    	MAXLINE = 25,
    	DELAY = 500000000	
    };
    
    typedef struct numbers {
    	long array[MAXNUM];
    	int num;
    } NUMBERS;
    
    int readline(char *a);
    int estrtol(char *line, long *n);
    int cmp(const void *p1, const void *p2);
    void nanoprint(NUMBERS n);
    
    
    int main()
    {	
    	NUMBERS n = {{0}, 0};
    	
    	char line[MAXLINE];	
    	int i = 0;		
    	
    	printf("Zadejte cela cisla:\n");
    	
    	while (readline(line)) {
    		if (estrtol(line, &n.array[i])) {	
    			n.num++;		
    			i++;
    		}
    	}	
    	
    	printf("\n");
    	
    	qsort(n.array, n.num, 
    			sizeof(n.array[0]), cmp);	
    	
    	nanoprint(n);	
    		
    	return 0;
    }
    
    int readline(char *line)
    {	
    	int len;
    	
    	if (fgets(line, MAXLINE, stdin) != NULL) {    		
    		len = strlen(line);
    		if (len + 1 == MAXLINE &&
    			line[len-1] != '\n')		
    			while (getchar() != '\n')
    				;						
    		if (line[len-1] == '\n')
    			line[len-1] = '\0';	
    		return 1;
    	} 
    	else	
    		return 0;	
    }
    
    int estrtol(char *line, long *n)
    {
    	char *endptr;
    	errno = 0;
    	
    	*n = strtol(line, &endptr, 10);		
    	
    	if (*endptr != '\0') {
    		printf("error: not a number\n");
    		return 0;
    	} 
    	else if (errno == ERANGE && *n == LONG_MAX) {  
    		printf("error: overflow\n");					
    		return 0;
    	}
    	else if (errno == ERANGE && *n == LONG_MIN) {  
    		printf("error: underflow\n");		
    		return 0;
    	}
    	else if (endptr == line) {
    		printf("error: empty input\n");		
    		return 0;
    	}
    	else
    		return 1;
    }
    
    int cmp(const void *p1, const void *p2)
    {
    	long a, b, c;
    	
    	a = *(long *) p1;
    	b = *(long *) p2;
    	
    	c = a < b ? -1 :
    		a == b ? 0 : 1;
    	
    	return c;
    }
    
    void nanoprint(NUMBERS n)
    {	
    	struct timespec ts = {0, DELAY};
    	int i;
    	
    	for(i = 0; i < n.num; i++) {
    		printf("%ld\n", n.array[i]);
    		nanosleep(&ts, NULL);	
    	}
    }
           

    Hodnocení: 50 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    28.3. 21:50 pc2005 | skóre: 33 | blog: GardenOfEdenConfiguration | déšť a kopce
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    long int strtol(const char *str, char **endptr, int base)
    Proč vlastně?
    Chuck Norris řekl babičce, že si dá jen 3 knedlíky. A dostal 3 knedlíky. | 帮帮我,我被锁在中国房
    28.3. 22:02 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Funkce nepotřebuje ten string měnit, takže není důvod tam const nedat, aspoň se vyhnete zbytečnému přetypovávání v případě, že potřebujete předat string, který už const je.
    28.3. 23:13 pc2005 | skóre: 33 | blog: GardenOfEdenConfiguration | déšť a kopce
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Aha divný já měl pocit že mě jednou gcc varovalo že vyžaduje const char * ...
    Chuck Norris řekl babičce, že si dá jen 3 knedlíky. A dostal 3 knedlíky. | 帮帮我,我被锁在中国房
    28.3. 22:29 dev
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    ze slušnosti.
    Bedňa avatar 28.3. 23:07 Bedňa | skóre: 33 | blog: Žumpa | Horňany
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Je otázka či o toto ešte niekto v 21stročí stojí :)
    Pokecajte si s umelou stupiditou na http://www.kernelultras.org/
    29.3. 11:31 Jardík
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    U funkce strtol (a příbuzných) je dobré zmínit, že pro správnou detekci selhání je před voláním funkce potřeba nastavit ručně errno na nulu. V opačném případě je jakýkoliv další pokus o zjištění selhání (přetečení) naprosto zbytečná záležitost. U příbuzných unsigned variant (strtoul) bych zmínil, že klidně přijmou záporné číslo a "zkonvertují" ho na kladné (podle pravidla převodu signed na unsigned). Proto je dobré před voláním funkce zkontrolovat první nebílý znak, jestli není mínus.
    29.3. 11:36 Jardík
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Vidím, že v kódu errno na nulu nastavuješ, stálo by ale za to zmínit to v zápisu.
    Josef Kufner avatar 31.3. 17:45 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Koukni na http://cppreference.com/ a na manuálové stránky (man 3 strtol).
    Hello world ! Segmentation fault (core dumped)
    6.4. 11:25 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    A čo tak skôr použiť int usleep(useconds_t usec) z unistd.h?
    6.4. 12:38 sad
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Tato funkce je zastaralá.
    11.4. 20:54 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Kto povedal? Prečo? ... V unistd.h je stále.
    12.4. 08:58 sad
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Tak píšou to zde.
    6.4. 13:36 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Štruktúru NUMBERS radšej definuj ako numbers_t. Rob radšej tak. Ak nechapeš, začni čítať iné kody a zmeniš možno názor.

    A nedefinuj takto:
    NUMBERS n = {{0}, 0};
    
    ale
    numbers_t numbers;
    // bzero(&numbers, sizeof(numbers_t)); /* keď nenastavuješ všetky prvy v štrukture pri inicializacií v programe */
    numbers.array={0};
    numbers.num=0;
    
    A parametre funkcie nedefinuj ako typ void, ale ako long *. Nakoľko môžeš pri preklade dať skontrolovať typovú kontrolu. Čo pri void sa stratí.
    6.4. 13:56 sad
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Díky za tipy.
    6.4. 14:11 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    "Polymorfizmus" void používaj, keď je potrebné. V Tvojom prípade nie je nutné.
    6.4. 14:16 Dušan Kreheľ | skóre: 9 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
    Ako pre int cmp(const void *p1, const void *p2).

    Založit nové vláknoNahoru

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