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 00:55 | Nová verze

Byla vydána verze 0.1.0 svobodného grafického editoru Glimpse (Glimpse Image Editor). Jedná se o první verzi tohoto forku grafického editoru GIMP (GNU Image Manipulation Program). Důvodem vzniku editoru Glimpse bylo odmítnutí přejmenování GIMPu. Vývojáře a uživatele Glimpsu slovo gimp uráží.

Ladislav Hagara | Komentářů: 0
včera 14:33 | Zajímavý projekt

Firma System76 v současnosti prodává upravené notebooky Clevo s předinstalovaným Linuxem (např. vlastní distribuce Pop!_OS), ale také vlastní desktopové sestavy Thelio. V příštích letech se chystá, jak informuje Jason Evangelho (rozhovor), pracovat na vlastním návrhu notebooků, nejprve „ultrabooku“ a posléze případně i přenosných pracovních stanic. Na trh by se mohly dostat za dva až tři roky.

Fluttershy, yay! | Komentářů: 13
včera 14:22 | Zajímavý článek

Příspěvky na blogu LimitedResults (Twitter) jsou věnovány bezpečnosti čipů ESP32. Poslední příspěvek je věnován bezpečností chybě CVE-2019-17391. Útočník s fyzickým přístupem může z čipů vytáhnout klíče pro šifrování i bezpečné bootování. Vyjádření společnosti Espressif Systems. Chyba je opravena v čipu ESP32-D0WD-V3.

Ladislav Hagara | Komentářů: 1
21.11. 23:11 | Nová verze

Do 3. prosince probíhá na Humble Bundle slevová akce Fall Sale. V rámci této akce lze do neděle do 19:00 získat počítačovou hru Serial Cleaner (YouTube) běžící také v Linuxu zcela zdarma.

Ladislav Hagara | Komentářů: 0
21.11. 20:55 | Nová verze

Byla vydána nová verze 2.81 svobodného 3D softwaru Blender. Podrobný přehled novinek v oznámení o vydání.

Ladislav Hagara | Komentářů: 1
21.11. 16:22 | Zajímavý článek

Nadace Raspberry Pi vydala knihu s názvem Get Started With Arduino. Elektronická kniha je ke stažení zdarma (pdf). Tištěnou verzi lze koupit za 10 liber.

Ladislav Hagara | Komentářů: 1
21.11. 13:22 | IT novinky

Společnost Slimbook prodávající notebooky s nainstalovaným Linuxem, viz například KDE Slimbook, dnes představila svůj nový notebook PRO X 15. Cena notebooku je od 1 199 eur a porovnáván je s notebooky Apple MacBook PRO 16 nebo Dell XPS 15 2019.

Ladislav Hagara | Komentářů: 8
20.11. 15:44 | Nová verze

Byla vydána nová major verze open source komunikačního softwaru Jami (Wikipedie, GitLab). Její název je Free as in Freedom. Dřívější názvy projektu Jami byly SFLphone a následně Ring.

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

Společnost MNT Research má v plánu na Crowd Supply spustit kampaň na podporu open source notebooku MNT Reform. Vývoj notebooku lze sledovat na Mastodonu.

Ladislav Hagara | Komentářů: 16
20.11. 00:11 | Zajímavý software

Chcete si zahrát víceuživatelský tetris v terminálu? Stačí spustit ssh netris.rocketnine.space. Na straně serveru běží netris. Zdrojové kódy v programovacím jazyce Go jsou k dispozici pod licencí GPLv3.

Ladislav Hagara | Komentářů: 0
Jaké hodinky nosíte (nejčastěji)?
 (25%)
 (5%)
 (16%)
 (54%)
Celkem 318 hlasů
 Komentářů: 39, poslední včera 16:39
Rozcestník

Funkce strtol a nanosleep (jazyk C)

28.3.2017 21:09 | Přečteno: 1217× | Linux | poslední úprava: 28.3.2017 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.2017 21:50 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
long int strtol(const char *str, char **endptr, int base)
Proč vlastně?
28.3.2017 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.2017 23:13 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
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 * ...
28.3.2017 22:29 dev
Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
ze slušnosti.
Bedňa avatar 28.3.2017 23:07 Bedňa | skóre: 34 | 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í :)
KERNEL ULTRAS video channel >>>
29.3.2017 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.2017 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.2017 17:45 Josef Kufner | skóre: 69
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.2017 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.2017 12:38 sad
Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
Tato funkce je zastaralá.
11.4.2017 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.2017 08:58 sad
Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
Tak píšou to zde.
6.4.2017 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.2017 13:56 sad
Rozbalit Rozbalit vše Re: Funkce strtol a nanosleep (jazyk C)
Díky za tipy.
6.4.2017 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.2017 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.