Oznake: Formatirani ulaz, formatirani izlaz, printf, scanf, fgets, getch, formatni niz, specificator formata, zastavice, kontrolni znakovi.
Formatirani izlaz
Danas ćemo pogledati dva važne funkcije formatirani ulaz i izlaz. Struktura i rad ovih funkcija mogu se u potpunosti razumjeti tek nakon proučavanja rada s pokazivačima i funkcijama s varijabilni broj parametrima. Ali sada morate koristiti ove funkcije, tako da ćete morati preskočiti neke točke.
Formatirana izlazna funkcija printf uzima niz formata i argumente za ispis prema formatu kao argumente i vraća broj ispisanih znakova. Vraća se u slučaju pogreške negativno značenje i postavlja vrijednost na ferror. Ako je došlo do više pogrešaka, errno je jednak EILSEQ.
int printf (const char * format, ...);
#uključiti
Funkcija petlja kroz niz i zamjenjuje prvo pojavljivanje % s prvim argumentom, drugo pojavljivanje % s drugim argumentom itd. Zatim ćemo samo pogledati popis zastava i primjere korištenja.
Opća sintaksa specificatora formata
% [zastavice] [širina] [. preciznost] [dužina] specificator
Specifikator je najviše važna komponenta... Definira vrstu varijable i način na koji se prikazuje.
Specifikator | Ono što želimo povući | Primjer |
---|---|---|
d ili i | Predpisani cijeli broj u in decimal | 392 |
u | Decimala bez predznaka | 7235 |
o | Neoznačeni oktal | 657 |
x | Heksadecimalni cijeli broj bez predznaka | 7fa |
x | Neoznačeni cijeli broj, heksadecimalni, velika slova | 7FA |
f ili F | Broj s pomičnim zarezom | 3.4563745 |
e | Eksponencijalni oblik za broj s pomičnim zarezom | 3.1234e + 3 |
E | Eksponencijalni oblik za broj s pomičnim zarezom, velika slova | 3.1234E + 3 |
g | Najkraći prikaz formata f i e | 3.12 |
G | Najkraći od prikaza formata F i E | 3.12 |
a | Heksadecimalni prikaz s pomičnim zarezom | -0xc.90fep-2 |
A | Heksadecimalno s pomičnim zarezom, velika slova | -0xc.90FEP-2 |
c | Pismo | a |
s | String (niz slova završenih nulom) | Pozdrav svijete |
str | Adresa pokazivača | b8000000 |
n | Ništa ne krpi. Argument mora biti pokazivač na potpisanu int. Ova adresa će pohraniti broj slova koja su bila prikazana prije sastanka% n | |
% | Dva uzastopna postotka prikazuju znak postotka | % |
#uključiti
Niz formata također može uključivati sljedeće neobavezne podspecifikatore: zastavu, širinu, .precision i modifikator (tim redoslijedom).
.Točnost | Opis |
---|---|
.broj | Za specifikacije cjelobrojnih (d, i, o, u, x, X), preciznost određuje minimalni broj znakova koji se moraju ispisati. Ako je vrijednost kraća, ispred broja se prikazuju nule. Vrijednost se ne skraćuje, čak i ako je duža. Preciznost od 0 znači da se ništa ne ispisuje za vrijednost 0. Za specifikacije s pomičnim zarezom (a, A, e, E, f, F), ovo je broj znakova za ispis nakon decimalne točke (zadano 6). Za g i G, ovo je broj značajnih znamenki koje treba ispisati. Za s se prikazuje navedeni broj znakova. Prema zadanim postavkama, izlaze se svi znakovi do prve nule. Ako nema broja, tada je zadana preciznost 0 |
.* | Preciznost nije navedena u nizu formata, prosljeđuje se zasebno kao argument, koji mora prethoditi izlaznom broju |
#uključiti
Podspecifikator duljine mijenja duljinu tipa. Ako se duljina ne podudara s vrstom, vrši se pretvorba u traženu vrstu, ako je moguće.
specifikacije | |||||||
---|---|---|---|---|---|---|---|
Duljina | d, i | u o x X | f F e E g G a A | c | s | str | n |
(nijedno) | int | unsigned int | dvostruko | int | char * | praznina * | int * |
hh | potpisani char | unsigned char | potpisani znak * | ||||
h | kratki međunar | nepotpisan kratki int | kratki int * | ||||
l | dugo int | unsigned long int | wint_t | wchar_t * | duga int * | ||
ll | dugo dugo int | unsigned long long int | long long int * | ||||
j | intmax_t | uintmax_t | intmax_t * | ||||
z | veličina_t | veličina_t | veličina_t * | ||||
t | ptrdiff_t | ptrdiff_t | ptrdiff_t * | ||||
L | duga dvostruka |
#uključiti
Formatirani unos
Razmislite o formatiranom unosu sa scanf-om.
int scanf (const char *, ...)
Funkcija prihvaća niz ulaznog formata (sličan je nizu formata printf) i adrese na koje treba upisati pročitane podatke. Vraća broj uspješno inicijaliziranih argumenata.
Format specifikacije unosa
% [*] [širina] [dužina] specificator
Specifikator | Opis | Odabrani likovi |
---|---|---|
ja, u | Cijeli | proizvoljan broj znamenke (0-9), moguće koje počinju s + ili -. Ako broj počinje s 0, tada se čita u oktalnom formatu, ako od 0x, onda u heksadecimalnom formatu. |
d | Decimalni cijeli broj | Proizvoljan broj znamenki (0-9), eventualno počevši s + ili -. |
o | oktalni cijeli broj | Proizvoljan broj znamenki (0-7), eventualno počevši s + ili -. |
x | Heksadecimalni cijeli broj | Proizvoljan broj znamenki (0-F), eventualno počevši s + ili - i s prefiksom 0x ili 0X. |
f, e, g | Broj s pomičnim zarezom | Broj koji se sastoji od skupa znamenki 0-9, moguće s decimalnim razdjelnikom (točkom). Moguća je i eksponencijalna notacija. C99 vam također omogućuje unos broja u heksadecimalnom formatu. |
a | ||
c | Simbol | Ako širina nije proslijeđena, čita se jedan znak. Ako je širina proslijeđena, tada čita potreban broj znakova i stavlja ih u niz BEZ terminalnog znaka na kraju. |
s | Crta | Čita sve znakove bez razmaka. Ako je navedena širina, onda ne više od n znakova. Zamjenjuje n + 1 terminalnih znakova. |
str | Adresa pokazivača | Niz znakova koji se tumači kao adresa pokazivača. Format ovisi o implementaciji, ali isti kao i kako printf izlazi s ključem p |
[likovi] | Mnogo likova | Čita samo one znakove koji su napisani u uglastim zagradama, C99 |
[^ znakova] | Mnogo likova | Čita samo one znakove koji nisu navedeni u uglastim zagradama, C99 |
n | Ne čita ništa | Sprema broj znakova koji su već pročitani na navedenu adresu |
Kao i kod printf-a, širina specificirana znakom * očekuje argument koji će dati širinu. Dužina zastave je ista kao i takva zastava printf funkcije.
#uključiti
Osim funkcija scanf i printf, postoji niz funkcija koje vam omogućuju primanje ulaznih podataka.
int gettch ()- vraća uneseni znak, ali ga ne ispisuje na konzolu. #uključitichar * fgets (char * str, int num, FILE * stream)- funkcija vam omogućuje čitanje niza s razmacima. Unatoč činjenici da radi s datotekom, možete je koristiti za čitanje standardni tok ulazni. Njegova prednost u odnosu na gets je u tome što vam omogućuje specificiranje maksimalna veličina redak koji se čita i završava redak završnim znakom.
#uključiti
Nije cijeli set različite funkcije unos i izlaz znakova. Takvih funkcija ima puno, ali mnoge od njih nisu sigurne, stoga pažljivo pročitajte dokumentaciju prije korištenja.
] SCANF #include
Kako je dobro kad se daju svi podaci, a ništa ne treba unositi. Ali, vjerujte mi, to se praktički ne događa. Sjetite se škole, kada ste mjerili određene stvari, a zatim su dobivene vrijednosti umetnute u potrebne formule.
scanf
U jeziku C, osim printf izlazne funkcije, postoji i funkcija scanf za unos. Evo funkcije scanf upravo sada i pogledat ćemo pobliže:
int i;
scanf ("% d", & i);
Čini se vrlo sličnim funkciji printf. Također dostupno u dvostruki navodnici specifikacija formata, no razlika je u drugom dijelu funkcije. Primijetili ste pojavu znaka (&)? Dakle, ovaj znak znači uzeti adresu. Odmah ću objasniti zašto je to potrebno.
Unesenu vrijednost moramo napisati ne negdje tamo, već točno na adresi na kojoj se nalazi naša varijabla. Oni. unsigned (&) naša unesena vrijednost ići će na sva mjesta osim na ono što nam je potrebno. Stoga, kad god trebate unijeti vrijednosti s tipkovnice, stavite znak adrese (&) ispred varijable.
Specifikatori formata
Pa sad idemo preko specifikacije formata:- % d - čitanje cijelog broja
- % o - čita se oktalni broj
- % x - čitanje heksadecimalnog broja
- % e (% f) - čitanje realnog broja
- % s - znak za čitanje
- % s - red za čitanje
int i;
scanf ("% d", & i);
int i;
scanf ("% o", & i);
int i;
scanf ("% x", & i);
plutati t;
scanf ("% f", & t);
char ch;
scanf ("% c", & ch);
char * str ;;
scanf ("% s", str);
Nemojte se još baviti radom sa žicama. Zašto nema znakova preuzimanja adrese? Ovu temu ćemo razmotriti malo kasnije.
Operacije usporedbe
Računalo je izvorno instalirano booleova logika, tj. sve je izgrađeno na 0 i 1. Ako ne razumijete o čemu se radi, onda pogledajte film Matrix, gdje se svaki zeleni čuvar zaslona sastoji samo od ova dva magična broja.
Naravno, 0 i 1 su dobri, ali trebamo logički razum, dakle logičke operacije 0 je LAŽ, a 1 je TAČNO. Ovi koncepti TOČNO i LAŽNO su usko povezani operacije usporedbe... Za početak, ovdje su sve vrste operacija usporedbe:
Uglavnom, najčešća pogreška koju čine početnici je da pomiješaju operaciju dodjele (=). operacija usporedbe(==). To su potpuno različite stvari. Ali na početku kodiranja svi imaju greške upravo po ovoj osnovi, stoga budite oprezni.
Funkcija scanf () je procedura Opća namjena koji čita stdin tok i sprema informacije u varijablama koje su specificirane argumentima navedenim u popisu argumenata. Može čitati sve ugrađene vrste podataka i automatski ih pretvoriti u odgovarajući interni format.
C99 primjenjuje kvalifikator ograničenja na parametar formata.
Kontrolni niz naveden parametrom formata sastoji se od tri kategorije znakova:
- specifikacije formata;
- razmak znakova;
- znakovi osim razmaka.
Specifikatori formata - kojima prethodi znak postotka (%) - govore vam koja će se vrsta podataka sljedeće čitati. Na primjer, specifikacija % s će pročitati niz, a % d će pročitati cjelobrojnu vrijednost. Niz formata se čita s lijeva na desno, a specificatori formata se podudaraju s argumentima navedenim na popisu argumenata. Ovi kodovi su prikazani u sljedećoj tablici.
Kod | Ugovoreni sastanak |
---|---|
%a | Čita vrijednost s pomičnim zarezom (samo C99) |
%A | Isto kao% kod (samo C99) |
%S | Čita jedan znak |
% d | Čita decimalni cijeli broj |
% i | Čita cijeli broj u bilo kojem formatu (decimalno, oktalno, heksadecimalno) |
% e | Čita pravi broj |
% E | Slično kodu% e |
% f | Čita pravi broj |
% F | Isto kao kod % f (samo C99) |
% g | Čita pravi broj |
% G | Isto kao kod% g |
%O | Čita oktalni broj |
% s | Čita redak |
%X | Čita heksadecimalni broj |
% X | Slično kodu% x |
%R | Čita pokazivač |
% n | Prihvaća cjelobrojnu vrijednost jednaku broju do sada pročitanih znakova |
% u | Čita decimalni cijeli broj bez predznaka |
% | Traži skup znakova |
%% | Čita znak postotka |
Prema zadanim postavkama, specifikacije a, f, e i g prisiljavaju scanf () da dodijeli podatke varijablama. plutati... Ako jednom od ovih specifikacija formata dodate modifikator l, scanf () će dodijeliti ono što je pročitao varijabli tipa dvostruko... Upotreba modifikatora L znači da je varijabla koja uzima vrijednost tipa long double.
Ako koristite moderan prevodilac koji podržava mogućnost dvobajtnog karaktera dodanog 1995. godine, možete koristiti modifikator l u specifikaciji c da označite pokazivač na dvobajtni znak s tipom podataka whcar_t. Modifikator l se također može koristiti s kodom formata s za označavanje pokazivača na dvobajtni niz znakova. Osim toga, modifikator l može se koristiti za izmjenu dvobajtnog skupa znakova koji se skenira.
Razmaci u nizu formata uzrokuju da scanf () preskoči jedan ili više znakova razmaka u ulaznom toku. Razmak se odnosi na razmak, tabulator ili znak novog reda. U suštini, jedan znak razmaka u kontrolnom nizu će uzrokovati da scanf () čita, ali ne i pohranjuje, bilo koji broj (čak i nula) razmaka do prvog razmaka koji nije razmak.
Znak koji nije razmak u nizu formata uzrokuje da scanf () pročita i odbaci odgovarajući znak. Na primjer, kada koristite niz formata % d,% d, scanf () će prvo pročitati cjelobrojnu vrijednost, zatim pročitati i odbaciti zarez i na kraju pročitati drugi cijeli broj. Ako se navedeni znak ne pronađe, funkcija scanf () će izaći.
Sve varijable koje se koriste za primanje vrijednosti s funkcijom scanf () moraju se proslijediti koristeći njihove adrese. To znači da svi argumenti moraju biti pokazivači na varijable.
Elementi ulaznog toka moraju biti odvojeni razmacima, tabulatorima ili novim redcima. Znakovi kao što su zarez, točka-zarez itd. nisu prepoznati kao razdjelnici. To znači da operater
Scanf ("% d% d", & r, & c);
prihvatit će unesene vrijednosti kao 10 20, ali će potpuno odbaciti "jelo" posluženo kao 10.20.
* iza znaka % i prije koda formata čitat će podatke dati tip ali će zabraniti njihovu dodjelu. Stoga, operater
Scanf ("% d% * c% d", & x, & y);
prilikom unosa podataka u obrazac 10/20, u varijablu x smjestit će vrijednost 10, odbaciti znak dijeljenja i dodijeliti vrijednost 20 varijabli y.
Naredbe za oblikovanje mogu sadržavati modifikator maksimalna duljina polja. To je cijeli broj između znaka % i koda formata koji ograničava broj znakova koji se mogu pročitati za bilo koje polje. Na primjer, ako u adresnu varijablu ne želite pročitati više od 20 znakova, upotrijebite sljedeću naredbu.
Scanf ("% 20s", adresa);
Ako ulazni tok sadrži više od 20 znakova, tada će sljedeći poziv na operaciju unosa početi čitati od točke gdje je prethodni poziv funkciji scanf () "zaustavljen". Nakon otkrivanja razmak znak unos podataka za polje može se završiti prije nego što se dosegne maksimalna duljina polja. U ovom slučaju, funkcija scanf () prelazi na čitanje sljedećeg polja.
Iako se razmaci, tabulatori i novi redovi koriste kao razdjelnici polja, čitaju se kao i svaki drugi znak kada se čita jedan znak. Na primjer, ako se ulazni tok sastoji od znakova x y, tada operator
Scanf ("% c% c% c", & a, & b, & c);
stavit će znak x u varijablu a, razmak u varijablu b i znak y u varijablu c.
Zapamtite da svi drugi likovi kontrolna linija Specifikatori bez formata (uključujući razmake, tabulatore i nove retke) koriste se za podudaranje i odbacivanje znakova iz ulaznog toka. Na primjer, ako ulazni tok izgleda kao 10t20, operator
Scanf ("% st% s", & x, & y);
stavit će 10 u x i 20 u y. Znak t se odbacuje jer se pojavljuje u kontrolnom retku.
Drugi način korištenja funkcije scanf () naziva se scanset. U tom slučaju se određuje skup znakova koji se može pročitati pomoću funkcije scanf () i dodijeliti odgovarajućem nizu znakova. Da biste definirali takav skup, morate staviti znakove koji se skeniraju u uglaste zagrade. Otvor uglata zagrada mora odmah slijediti znak postotka. Na primjer, sljedeći skup skeniranih znakova označava da je potrebno pročitati samo znakove A, B i C.
% [ABC]
Kada se koristi skup znakova koji se skenira, scanf () nastavlja čitati znakove i stavlja ih u odgovarajući niz znakova sve dok ne naiđe na znak koji nije u navedenom skupu. Odgovarajuća varijabla mora biti pokazivač na niz znakova. Kada se vrati iz scanf (), ovaj će niz sadržavati niz pročitanih znakova završen nulom.
Ako je prvi znak u skupu znak za uznačavanje (^), tada dobivamo suprotan učinak: polje za unos se čita do prvog znaka iz zadanog skupa znakova, tj. znak caret uzrokuje da scanf () prihvati sve znakove koji nisu definirani u skupu.
Mnogi prevoditelji vam omogućuju da navedete raspon s crticom. Na primjer, sljedeća izjava uzrokuje da scanf () prihvati znakove od A do Z.
Važno je zapamtiti da skenirani skup znakova razlikuje velika slova i mala slova... Stoga, ako želite skenirati i velika i mala slova, postavite ih zasebno.
Funkcija scanf () vraća broj jednak broju polja kojima su uspješno dodijeljene vrijednosti. Ova polja ne uključuju polja koja su pročitana, ali dodjela nije izvršena zbog upotrebe modifikatora * za suzbijanje dodjele. Ako se dogodi pogreška prije dodjeljivanja prvog polja, scanf () vraća EOF.
C99 je dodao modifikatore formata u scanf ().
Verzija C99 dodaje nekoliko modifikatora formata za korištenje u funkciji scanf (): hh, ll, j, z i t. Modifikator hh može se primijeniti na specifikacije d, i, o, i, x i n. To znači da je odgovarajući argument pokazivač na vrijednost znakova s predznakom ili bez predznaka. Modifikator ll također se može primijeniti na specifikacije d, i, o, i, x i n. To znači da je odgovarajući argument pokazivač na predznaku long long int ili neoznačenu long long int vrijednost.
Modifikator formata j, koji se primjenjuje na specifikacije d, i, o, u, x i n, znači da je odgovarajući argument pokazivač na vrijednost tipa intmax_t ili uintmax_t. Ove vrste su deklarirane u zaglavlju
Modifikator formata z, koji se primjenjuje na specifikacije d, i, o, u, x i n, znači da je odgovarajući argument pokazivač na objekt tipa size_t. Ova vrsta je deklarirana u zaglavlju
Modifikator formata t, koji se primjenjuje na specifikacije d, i, o, u, x i n, znači da je odgovarajući argument pokazivač na objekt tipa ptrdiff_t. Ova vrsta je deklarirana u zaglavlju
Funkcija printf () omogućuje ispis informacija na zaslon prilikom programiranja u načinu rada konzole. Ova funkcija definiran je u biblioteci stdio.h i ima sljedeću sintaksu:
int printf (const char * format [, argument] ...);
Ovdje prvi argument, * format, specificira niz koji se ispisuje na zaslon i može sadržavati posebne kontrolne znakove za prikaz varijabli. Nakon toga slijedi popis neobaveznih argumenata, koji su objašnjeni u nastavku. Funkcija vraća ili broj prikazanih znakova ili negativan broj ako ne radi ispravno.
U svojoj najjednostavnijoj implementaciji, funkcija printf () jednostavno ispisuje dati niz na zaslon monitora:
printf ("Zdravo svijet.");
Međutim, može se koristiti za prikaz varijabli različiti tipovi: počevši s brojevima i završavajući nizovima. Za izvođenje ove operacije koriste se posebni kontrolni znakovi koji se nazivaju specifikacijama i koji počinju znakom %. Sljedeći primjer pokazuje izlaz cjelobrojne varijable num na zaslon monitora pomoću funkcije printf ():
int broj;
broj = 5;
printf (“% d”, broj);
Prva dva retka ovog programa definiraju varijablu pod nazivom num tipa int. Treći red ispisuje varijablu na ekran. Funkcija printf () izgleda ovako. Funkcija prvo analizira niz koji treba prikazati. V u ovom slučaju ovo je "% d". Ako ovaj redak sadrži specifikaciju, tada se na njegovo mjesto upisuje vrijednost varijable, koja je drugi argument funkcije printf (). Kao rezultat toga, umjesto originalna linija Na ekranu će se pojaviti "% D" redak "5", tj. prikazat će se broj 5.
Treba napomenuti da specifikacija "% d" daje samo cjelobrojne tipove varijabli, na primjer int. Druge specifikacije treba koristiti za deduciranje drugih tipova. Glavne vrste specifikacija navedene su u nastavku:
% s - jedan znak
% d - decimalni cijeli broj s predznakom
% f - broj s pomičnim zarezom (decimalni zapis)
% s - niz znakova (za varijable niza)
% u - decimalni cijeli broj bez predznaka
%% - ispis znaka postotka
Pomoću funkcije printf () možete ispisati nekoliko varijabli odjednom. Za to se koristi sljedeća konstrukcija:
int broj_i;
float num_f;
broj_i = 5;
broj_f = 10,5;
printf (“num_i =% d, num_f =% f”, num_i, num_f);
Rezultat izvršavanja programa će izgledati ovako:
broj_i = 5, broj_f = 10,5
Osim specifikacija, funkcija printf () koristi kontrolne znakove, kao što su redak \ n, tabs \ t, itd. Na primjer, ako je u prethodno razmatranom primjeru potrebno prikazati vrijednosti varijabli koje nisu u redak, ali u stupcu, tada se funkcija printf () mora prepisati na sljedeći način:
printf ("num_i =% d, \ n num_f =% f", num_i, num_f);
Znak tabulatora se koristi na sličan način.
Za unos informacija s tipkovnice, prikladno je koristiti funkciju scanf () biblioteke stdio.h, koja ima sljedeću sintaksu:
int scanf (const char * format [, argument] ...);
Ovdje, što se tiče funkcije printf (), definira se varijabla formata * format string za određivanje vrste ulaznih podataka i može sadržavati iste specifikacije kao funkcija printf (). Zatim, postoji popis neobaveznih argumenata. Listing 1.4 pokazuje kako scanf () radi.
Listing 1.4. Primjer korištenja funkcije scanf ().
#uključiti
int main ()
{
int starost;
težina plovka;
printf ("Unesite podatke o svojoj dobi:");
scanf (“% d”, & starost);
printf ("Unesite podatke o svojoj težini:");
scanf (“% f”, & težina);
printf (“Vaša dob =% d, vaša težina =% f”, dob, težina);
Vrati 0;
}
Glavna razlika između korištenja funkcije scanf () i printf () je znak & ispred naziva varijable u koju se zapisuju rezultati unosa.
Funkcija scanf () može raditi s nekoliko varijabli odjednom. Pretpostavimo da trebate unijeti dva cijela broja s tipkovnice. Formalno, za to možete dvaput pozvati funkciju scanf (), ali bolje je koristiti ovu konstrukciju:
scanf (“% d,% d”, & n, & m);
Funkcija scanf () to tumači kao da očekuje da korisnik unese broj, zatim zarez, a zatim drugi broj. Sve se događa kao da trebate unijeti dva cijela broja na sljedeći način:
Funkcija scanf () vraća broj uspješno pročitanih stavki. Ako se operacija čitanja nije dogodila, što se događa kada, umjesto očekivanog digitalna vrijednost unese se bilo koje slovo, tada je povratna vrijednost 0.