Knihovny funkcí. Chyby v CRT. IUJCE Přednáška č. 9



Podobné dokumenty
Práce se soubory. Úvod do programování 2 Tomáš Kühr

Práce se soubory. Úvod do programování 2 Tomáš Kühr

vstup a výstupv jazyce C

Práce se soubory. Základy programování 2 Tomáš Kühr

Vstup a výstup datové proudy v C

- jak udělat konstantu long int: L long velka = 78L;

vstup a výstupy jazyce C

Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

Standardní vstup a výstup

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

10 Práce s řetězci - pokračování

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

vstup a výstupy jazyce C

Algoritmizace a programování

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

IUJCE 07/08 Přednáška č. 1

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Racionální čísla, operátory, výrazy, knihovní funkce

Racionální čísla, operátory, výrazy, knihovní funkce

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

Formátové specifikace formátovací řetězce

PB071 Programování v jazyce C

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

- tzv. standardní vstupní a výstupní proud (input / output stream)

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Práce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

IUJCE 07/08 Přednáška č. 6

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Zápis znakù pomocí výjimkových kódù

11b Další příklady operací vstupu a výstupu (úvod viz 10)

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Jazyk C++, některá rozšíření oproti C

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru

Proměnná a její uložení v paměti

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Úvod do programování. Lekce 1

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

VISUAL BASIC. Práce se soubory

Zápis programu v jazyce C#

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

Základy programování (IZP)

IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Základy programování (IZP)

Jazyk C Část II. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 9 A0B36PR2 Programování 2

Operační systémy. Cvičení 4: Programování v C pod Unixem

Odvozené a strukturované typy dat

Reference jazyka C - Tahák

Algoritmizace a programování

Operační systémy. Cvičení 3: Programování v C pod Unixem

Iterační výpočty. Dokumentace k projektu č. 2 do IZP. 24. listopadu 2004

Struktury a dynamická paměť

Opakování programování

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {...

Jazyk C Část II. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 9 A0B36PR2 Programování 2

Standardní knihovny C. Rekurze.

Ošetřování chyb v programech

Část 1 Příklad Pracujeme s ukazateli. Jazyk C Část II. Část 3 Jazyk C - základní knihovny, dynamická alokace paměti, soubory

Část I. Část 1 Příklad Pracujeme s ukazately

X36UNX 16. Numerické výpočty v sh příkazy expr, bc, dc. Zdeněk Sojka

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Příklad: Součet náhodných čísel ve vektoru s počtem prvků, které zadá uživatel, pomocí sum() a pomocí cyklu for. Ověříme, že příliš výpisů na

Algoritmizace a programování

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Část 1 Standardní knihovny, čtení/zápis ze/do souboru

IAJCE Přednáška č. 7. řízení semaforu na křižovatce = přepínání červená/oranžová/zelená

Část I. Část 1 Standardní knihovny, čtení/zápis ze souboru. Přehled témat. Standardní knihovny C. Rekurze. Standardní knihovny

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Algoritmizace a programování

Algoritmizace a programování

PROGRAMOVÁNÍ V C++ CVIČENÍ

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

Řešení sady 1. Úvod do programování 1 Tomáš Kühr

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Stromy, soubory. BI-PA1 Programování a Algoritmizace 1. Ladislav Vagner, Josef Vogel

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

Základy jazyka C. Základy programování 1 Tomáš Kühr

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Standardní knihovny C. Rekurze.

Paměť počítače. alg2 1

Programování v C++ 1, 1. cvičení

Lekce 19 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

ZÁPOČTOVÝ TEST. Zpracoval Vilém Závodný, #include "stdafx.h" #include "stdio.h"

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Algoritmy a datové struktury

Reprezentace dat v informačních systémech. Jaroslav Šmarda

Transkript:

Knihovny funkcí C run time library (CRT) = soubor funkcí dodávaných spolu s překladačem, optimalizované velmi rychlé C = very simple, většina funkčnosti jazyka CRT C dle ISO/IEC9899: o assert.h Chyby v CRT o ctype.h o errno.h o float.h o limits.h o locale.h o math.h o setjmp.h o signal.h o stdarg.h o stddef.h o stdio.h. o stdlib.h o string.h o time.h errno.h makra pro ladění třídění znaků globální proměnná errno vlastnosti reálných čísel vlastnosti celých čísel modifikace národního prostředí (nepoužívá se) matematické funkce funkce s proměnným počtem parametrů obecná makra (jsou i jinde) standardní vstup, výstup dynamické proměnné, náhodná čísla, řazení, ukončení programu řetězce čas a datum případná chyba uložena do globální proměnné int errno nutno kontrolovat ihned na začátku programu vhodné vynulovat chybové kódy dle ANSI C (#define...) o EDOM = vstup mimo obor o ERANGE = výstup mimo rozsah o EILSEQ = neplatná sekvence bytů Microsoft CRT ~40 kódů možnost přepsání dalším voláním CRT funkce 1

ukázka zpracování chyby v math.h #include <stdio.h> #include <string.h> // pro strerror() #include <errno.h> #include <math.h> double x; errno = 0; x = log(-5); if (errno!= 0) puts(strerror(errno)); char *strerror(int errnum); v string.h vrací textový popis chyby (uložené v errno) o např. pro ERANGE Matematické konstanty math.h Result too large #define M_E 2.71828182845904523536 #define M_LOG2E 1.44269504088896340736 #define M_LOG10E 0.434294481903251827651 #define M_LN2 0.693147180559945309417 #define M_LN10 2.30258509299404568402 #define M_PI 3.14159265358979323846 #define M_PI_2 1.57079632679489661923 #define M_PI_4 0.785398163397448309616 #define M_1_PI 0.318309886183790671538 #define M_2_PI 0.636619772367581343076 #define M_2_SQRTPI 1.12837916709551257390 #define M_SQRT2 1.41421356237309504880 #define M_SQRT1_2 0.707106781186547524401 Matematické funkce většina v math.h, něco je i v stdlib.h Absolutní hodnoty int abs(int j); long labs(long j); double fabs(double j); // v stdlib.h // v stdlib.h Vrací absolutní hodnotu argumentu goniometrické funkce double sin(double x); double cos(double x); // vrací sinus argumentu // kosinus 2

double tan(double x); // tangens double asin(double x); // arkussinus double acos(double x); // arkuskosinus double atan(double x); // arkustangens double atan2(double y, double x); // počítá arcus tangens y/x pro tan() možná ERANGE pro hodnoty vstupu blízké k*pi/2 (k je sudé) zaokrouhlování double ceil (double x); // Zaokrouhlí arg na nejmenší vyšší celé číslo double floor (double x);// Zaokrouhlí arg na nejbližší nižší celé číslo double round(double x); // Zaokrouhlí číslo na nejbližší celé číslo žádné chyby nevrací logaritmy double exp(double x); Vrací e na x double log(double x); Vrací ln(x) double log10(double x); mocniny Vrací log(x) chyby log(), log10 o x 0 o x blízké k 0 errno = EDOM errno = ERANGE double pow(double x, double y); Vrací hodnotu x na y EDOM: o (x < 0) && (y není celé) o (x == 0) && (y < 0) double sqrt(double x); Vrací odmocninu z čísla x EDOM pro sqrt() záporného čísla Práce s reálným číslem double frexp(double x, int *nptr); číslo dle IEEE754 rozdělí na mantisu 0,5; 1) v návratové hodnotě a exponent nptr double ldexp(double x, int n); 3

z mantisy x a exponentu n vytvoří reálné číslo dle IEEE754 double modf(double x, double *iptr); Vrátí desetinnou část x a celou část uloží do *iptr Celočíselné dělení double fmod(double x, double y); vrací celočíselný zbytek po celočíselném dělení x/y div_t div(int n, int d); ldiv_t ldiv(long n, long d); vrací quot = n/d rem = n%d ve struktuře typedef struct { int quot; int rem; } div_t Vstupní a výstupní operace Úvod v stdio.h (Standard Input Output) založeny na bufferovaných proudech (bufferred streams) stdio.h definuje strukturu FILE informace o proudu o každá CRT překladače jiná příklad Microsoft CRT nikdy ne přímý přístup k položkám typedef struct { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; } FILE; proud pro jakékoli I/O zařízení soubory, konzole, paměť,... proud určuje mechanizmy práce s daty (R/W) 4

standardní proudy po spuštění programu k dispozici 3 proudy (obr. z wikipedia.org) extern FILE *stdin extern FILE *stdout extern FILE *stderr Soubory v C chybový výstup textový vs. binární soubor uložení dvou čísel typu char: 1 a 255: o textový soubor (každé číslo na samostatném řádku): 31 0d 0A 32 35 35 o binární soubor: 1 FF textové soubory organizovány po řádcích, končí domluveným znakem: o Windows <CR><LF> ("\n\r") o Linux <LF> ("\n") o Macintosh <CR> ("\r") Práce se souborem Otevření souboru 1) otevření souboru 2) práce s obsahem čtení, zápis pohyb po souboru seek 3) uzavření souboru = namapování konkrétního souboru na proměnnou typu FILE FILE * fopen(jmeno_souboru,"mod"); Jmeno_souboru = plné platné jméno souboru v OS (možné včetně cesty) o např. "C:\\Dokumenty\\soubor.txt" mod = přístupové modifikátory pro práci se souborem o Textové soubory: r čtení (read) w zápis, nebo přepsání (write) <CR><LF> ASCII 2 5

r+ čtení a zápis w+ čtení, zápis nebo přepsání a zápis na konec (append) a+ čtení a zápis na konec o Binární soubory: = textové, jen s b (rb, ra+ ) o vrací: OK handle (platnou proměnnou typu FILE *) chyba NULL upřesnění chyby errno přehled činnosti a reakcí mód soubor existuje neexistuje počáteční seek r R NULL 0 w Del, W W 0 a W W End r+ R/W NULL 0 w+ Del, R/W R/W 0 a+ R/W R/W End pozn.: módy + o po zápisu lze číst až po volání fsetpos(), fseek(), rewind() nebo flush() ošetření chyb FILE *fr; errno = 0; fr = fopen("source.txt", "r"); if (fr == NULL) printf("chyba pri otevirani souboru: \"%s\"\n", strerror(errno)); Uzavření souboru po skončení práce bufferované streamy dat neuzavření souboru před skončením programu = možná ztráta int fclose(file *stream); uzavře soubor a vyprázdní stream Přesměrování proudů do/ze souboru přes možnosti OS (DOS, Konzole Win32, UNIX) o c:\program.exe > stdout.txt o c:\program.exe < stdin.txt FILE *freopen(const char *path, const char *mode, FILE *stream); 6

přesměruje výstup z proudu stream do souboru path otevřený s příznaky mode int a; freopen("vystup.txt", "w", stdout); freopen("vstup.txt", "r", stdin); scanf("%d", &a); // bude se cist ze souboru printf("%d", a); // vypis do souboru Vstup / výstup znaku int fgetc(file* stream); int getc(file* stream); int getchar(); makro (efektivita) #define getchar() getc(stdin) vrací jeden znak ze proudu stream návratová hodnota int vrací -1 jako chybu své práce při uložení do char přetypování: char znak = (char)getchar(); problém bufferovaného stdin int znak1, znak2; znak1 = getchar(); znak2 = getchar(); z bufferu přečte '\n' na uživatelský vstup nečeká vyčká na uživatele; uživatel na klávesnici 'a'; buffer klávesnice 'a''\n'; fce vybere z bufferu 'a' o nutno přečtení bufferu po každém!!! volání getchar() až do '\n': Znak1 = getchar(); while (getchar()!= '\n'); Znak2 = getchar(); while (getchar()!= '\n'); // vyprazdneni bufferu // vyprazdneni bufferu fputc(int c, FILE* stream); putc(int c, FILE* stream); putchar(int znak); makro (efektivita) #define putchar(c) putchar(c, stdout) výstup znaku c do proudu stream použití: char znak; puchar(znak); puchar('\n'); // vypise znak // odratkuje int ungetc(int c, FILE* stream); 7

vrací znak c do proudu stream případě úspěchu vrací c, jinak EOF. volání max 1x za sebou, jinak nutno čtení nebo změna pozice ve streamu Vstup / výstup řetězce char *fgets(char *str, int n, FILE *stream); do str uloží max. n znaků z proudu *stream, za načtené znaky přidá '\0' čtení končí: o konec souboru o konec řádku o načteno n 1 znaků Poznámky: o pracuje správně i případě, že na posledním řádku není znak konce řádku o do str je uložen i '\n' char *gets(char *str); přečte znaky z stdin až do '\n', který nahradí '\0', a uloží je do str char retezec[50]; gets(retezec); nebezpečná funkce hrozí přetečení bufferu = velikost retezec < znaků na klávesnici char *fputs(char *str, FILE *stream); zapíše řetězec str do proudu stream char *puts(char *str); zapíše řetězec str do proudu stdout až ('\0' nahradí '\n') char retezec[50]; puts(retezec); Formátovaný vstup / výstup řetězce int printf(const char *format [,argument]...); int fprintf(file *stream, const char *format [,argument]...); zapíše formátovaný řetězec format do proudu stream (stdout) formátovací řetězec viz Příloha I Příklad funkce s PPP SouborOUT = fopen("output.txt","w"); fprintf(souborout, "Realne cislo = %lf\n", RealneCislo); fprintf(souborout, "Retezec = %s", Retezec); fclose(souborout); 8

o obsah souboru int fscanf(file *stream, const char *format [,argument ]...); int scanf(const char *format [,argument ]...); přečte z proudu stream (stdin) řetězec format a dle formátovacích řetězců v něm obsaženém uloží obsah do proměnných z seznamu argument viz příloha II příklad int i; double fp; char c, s[81]; scanf("%d %lf %c %80s", &i, &fp, &c, s); printf("%d %lf %c %s", i, fp, c, s); Detekce konce řádku neexistuje konstanta EOL (End Of Line) různé OS definovány jinak int znak; while ((znak = getc(soubor))!= '\n') { if (znak >= 32) { // zpracovani znaku } } ve Win přeskočení '\r' Detekce konce souboru konstanta EOF (End Of File) obvykle -1 int znak; while ((znak = getc(soubor))!= EOF) { // zpracovani znaku } 9

Příklad I Příklad II Příklad III Náhrada. za, v souboru s naměřenými daty int Znak; FILE *SouborIN, *SouborOUT; SouborIN = fopen("input.txt","r"); SouborOUT = fopen("output.txt","w"); while ((Znak = getc(souborin))!= EOF) { if (Znak == '.') Znak = ','; putc(znak, SouborOUT); } fclose(souborin); fclose(souborout); opět chybí ošetření chyb Program přečte soubor input.txt z disku, zobrazí ho na obrazovce a uloží kopii do souboru output.txt. Na začátek souboru output.txt připojí poznámku Toto je kopie souboru input.txt. #define MAX_ZNAKU_NA_RADEK 80 // uzitecnych, konzole 80x25 znaku char Radek[MAX_ZNAKU_NA_RADEK+1]; // +1 pro '\0' FILE *SouborIN, *SouborOUT; // otevreni souboru SouborIN = fopen("input.txt","r"); SouborOUT = fopen("output.txt","w"); fputs("toto je kopie souboru input.txt\n\n", SouborOUT); while (fgets(radek, MAX_ZNAKU_NA_RADEK+1, SouborIN)!= NULL) { // fgets cte max (n-1) znaku, +1 na posl. znak, +2 na '\n' printf("%s", Radek); // na obrazovku fputs(radek, SouborOUT); // do jineho souboru } fclose(souborin); fclose(souborout); výpis na obrazovku o opět chybí ošetření chyb printf(), puts() = '\n' navíc (je v řetězci od fgets()) čtení čísla ze souboru (délka řetězce před číslem neznámá) while (((Znak = getc(souborin)) < '0') (Znak > '9')); ungetc(znak,souborin); // vraceni '1' zpet du bufferu fscanf(souborin, "%lf", &JineRealneCislo); 10

Další souborové funkce stdio.h int fflush(file *stream); vyprázdní datového proudu stream. Vrací 0 = úspěch, jinak EOF. int feof(file *stream); vrací kladnou nenulovou hodnotu v případě dosažení konce souboru stream, jinak 0. int ferror(file *stream); v případě chyby souboru stream vrací kladnou nenulovou hodnotu, jinak 0. void clearerr(file *stream); nuluje indikátor konce souboru a chyby pro souborový proud stream. int fileno(file *stream); vrací (odkazem) deskriptor souboru datového proudu stream. pro přístup dle POSIX Práce se souborem na úrovni OS stdio.h int remove(const char *pathname); smaže soubor pathname int rename(const char *oldpath, const char *newpath); přejmenuje soubor oldpath na soubor newpath. Práce s binárními soubory int fseek(file *stream, long offset, int whence); posune kurzor v souboru stream na pozici vzdálenou offset od místa whence. long ftell(file *stream); Vrátí aktuální pozici kurzoru souboru stream. void rewind(file *stream); Posune kurzor na začátek souboru stream. int fgetpos(file *stream, fpos_t *pos); uloží aktuální pozici kurzoru do proměné pos. int fsetpos(file *stream, fpos_t *pos); obnoví pozici kurzoru z proměné pos. size_t fread(void *ptr, size_t size, size_t count, FILE *stream); 11

o načte count dat o velikosti 1 položky size bytů z proudu stream do paměti, kam ukazuje ptr. Vrací počet správně načtených položek. size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream); zapíše count dat o velikosti 1 položky size bytů do proudu stream z paměti kam ukazuje ptr. Vrací počet správně zapsaných položek. 12

Příloha I formátovací řetězce printf() %[flags][width][.precision][length]specifier specifier určuje typ a interpretaci příslušného argumentu výstup příklad c znak a d nebo i znaménkové celé číslo 392 e reálné číslo v exp. tvaru 3.9265e+2 E reálné číslo v exp. tvaru 3.9265E+2 f reálné číslo dekadicky 392.65 g kratší z %e nebo %f 392.65 G kratší z %E nebo %f 392.65 o znaménkové celé číslo v osmičkové soustavě 610 s řetězec (pointer na char) sample u bezznaménkové celé číslo 7235 x bezznaménkové celé číslo v hexa soustavě 7fa X bezznaménkové celé číslo v hexa soustavě 7FA p adresa (hodnota pointer) B800:0000 n nic netiskne. Argument musí být int*, kde je počet znaků % (= zdvojené %) vypíše % % length h l L význam argument interpretován jako short nebo unsigned short (platí pouze pro i, d, o, u, x, X) argument interpretován jako long nebo unsigned long (platí pouze pro i, d, o, u, x, X) argument interpretován jako long double (platí pouze pro e, E, f, g, G) precision význam číslo pro i, d, o, u, x, X číslo doplněno nulami zleva na délku číslo pro e, E, f počet míst za řádovou čárkou pro g, G maximální počet tisknutých znaků pro s počet významných číslic * přesnost udána jako další argument předcházející aktuálnímu argumentu (nikoli tedy ve formátovacím řetězci jako číslo) width význam číslo minimální počet tisknutých znaků. Je-li aktuální hodnota menší, argument doplněn nulami mezerami zleva * počet znaků udán jako další argument předcházející aktuálnímu argumentu (nikoli tedy ve formátovacím řetězci jako číslo) 13

flags význam výstup je zarovnán doleva v rámci počtu znaků daného width (standardně doprava) + vynutí tisk znaménka (standardně jen ) # pro specifier o vytiskne na začátku 0 pro x vytiskne na začátku 0x pro X vytiskne na začátku 0X pro e E f vynutí tisk řádové čárky pro g G vynutí tisk řádové čárky a doplní nevýznamné nuly zprava za řádovou čárkou 0 tiskne nevýznamné nuly zleva Příklady printf ("Znaky: %c %c \n", 'a', 65); printf ("Dekadicky: %d %ld\n", 1977, 650000); printf ("S mezerami zleva: %10d \n", 1977); printf ("S nulami zleva: %010d \n", 1977); printf ("Ruzne soustavy: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100); printf ("Realna cisla: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416); printf ("Pocet znaku v dalsim argumentu (*): %*d \n", 5, 10); printf ("Retezec: %s \n", "A string"); 14

Příloha II scanf() int scanf(const char *format [,argument ]...); format může obsahovat o bílé znaky na příslušné pozici v stdin bude scanf() ignorovat jakýkoli počet býlích znaků (mezera, tab, enter). První nebílý znak za bílými bude přečten o Nebílé znaky (kromě %) scanf() přečte další znak a porovná jej s příslušným znakem ve formátovacím řetězci. Bude-li: shodný scanf() jej vynechá různý scanf() ukončí čtení (zbytek znaků zůstane v stdin) o formátovací řetězce uvozené % Formátovací řetězec %[*][width][length]specifier specifier určuje typ a interpretaci příslušného argumentu vstup argument c znak char * d dekadické číslo (se znaménkem + ) int * e E f g G reálné číslo (se znaménkem + ) float * (v exp. tvaru 3.9e+2) o celé číslo v osmičkové soustavě int * s řetězec (čte dokud nenarazí na bílý znak) char * u bezznaménkové celé číslo unsigned int * x X celé číslo v hexa soustavě int * length h l L význam argument interpretován jako short nebo unsigned short (platí pouze pro i, d, o, u, x, X) argument interpretován jako long nebo unsigned long (platí pouze pro i, d, o, u, x, X) argument interpretován jako double (platí pouze pro e, E, f, g, G) argument interpretován jako long double (platí pouze pro e, E, f, g, G) length maximální počet znaků čtených pro daný formátovací řetězec * pro daný formátovací řetězec bude stdin čten, ale nebude ukládáno do argument 15

Příklady int den, mesic, rok; scanf(" datum: %d.%d.%d", &den, &mesic, &rok); pokud nezadáno, scanf() nic nepřečte 16