Tagovi: Formatirani ulaz, formatirani izlaz, printf, scanf, fgets, getch, format string, 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 sa pokazivačima i funkcijama sa varijabilni broj parametri. Ali ove funkcije morate koristiti sada, tako da ćete morati preskočiti neke točke.
Formatirana izlazna funkcija printf uzima niz formata i argumente koji će biti ispisani prema formatu kao argumente i vraća broj ispisanih znakova. Vraća se u slučaju greške negativno značenje i postavlja vrijednost na ferror. Ako je došlo do više grešaka, errno je jednako EILSEQ.
int printf (const char * format, ...);
#include
Funkcija petlja kroz string i zamjenjuje prvo pojavljivanje % s prvim argumentom, drugo pojavljivanje % s drugim argumentom, itd. Zatim ćemo samo pogledati listu zastavica i primjere korištenja.
Opća sintaksa specificatora formata
% [zastavice] [širina] [.preciznost] [dužina] specifikacija
Specifikator je najviše važna komponenta... Definira tip varijable i kako se prikazuje.
Specifikator | Ono što želimo da povučemo | Primjer |
---|---|---|
d ili i | Potpisani cijeli broj u in decimalni | 392 |
u | Neoznačeni cijeli decimalni broj | 7235 |
o | Neoznačeni oktal | 657 |
x | Heksadecimalni cijeli broj bez predznaka | 7fa |
X | Cijeli broj bez predznaka, 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će od prikaza F i E formata | 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 sa nulom) | Zdravo 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 procenta prikazuju znak procenta | % |
#include
Niz formata također može uključivati sljedeće opcione podspecifikatore: zastavicu, širinu, .precision i modifikator (tim redoslijedom).
.Preciznost | Opis |
---|---|
.broj | Za specifikacije cijelih brojeva (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 štampanje nakon decimalnog zareza (podrazumevano 6). Za g i G, ovo je broj značajnih cifara koje treba odštampati. Za s se prikazuje navedeni broj znakova. Po defaultu se izlaze 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 |
#include
Podspecifikator dužine mijenja dužinu tipa. Ako se dužina ne poklapa sa tipom, vrši se konverzija u traženi tip, ako je moguće.
specifikacije | |||||||
---|---|---|---|---|---|---|---|
Dužina | d, i | u o x X | f F e E g G a A | c | s | str | n |
(nijedna) | int | unsigned int | duplo | int | char * | praznina * | int * |
hh | signed char | unsigned char | potpisani znak * | ||||
h | kratki int | unsigned short int | kratki int * | ||||
l | long int | unsigned long int | wint_t | wchar_t * | duga int * | ||
ll | long long int | unsigned long long int | long long int * | ||||
j | intmax_t | uintmax_t | intmax_t * | ||||
z | size_t | size_t | size_t * | ||||
t | ptrdiff_t | ptrdiff_t | ptrdiff_t * | ||||
L | dugačak dupli |
#include
Formatirani unos
Razmislite o formatiranom unosu sa scanf-om.
int scanf (const char *, ...)
Funkcija prihvata 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] specifikacija
Specifikator | Opis | Odabrani likovi |
---|---|---|
i, u | Cijeli | proizvoljan broj cifre (0-9), moguće koje počinju sa + ili -. Ako broj počinje sa 0, onda se čita u oktalnom formatu, ako od 0x, onda u heksadecimalnom formatu. |
d | Decimalni cijeli broj | Proizvoljan broj cifara (0-9), eventualno počevši sa + ili -. |
o | oktalni cijeli broj | Proizvoljan broj cifara (0-7), eventualno počevši sa + ili -. |
x | Heksadecimalni cijeli broj | Proizvoljan broj cifara (0-F), eventualno počevši sa + ili - i sa prefiksom 0x ili 0X. |
f, e, g | Broj s pomičnim zarezom | Broj koji se sastoji od skupa cifara 0-9, moguće sa decimalnim separatorom (tačkom). Moguća je i eksponencijalna notacija. C99 vam takođe omogućava da unesete broj u heksadecimalnom formatu. |
a | ||
c | Simbol | Ako širina nije proslijeđena, čita se jedan znak. Ako je širina proslijeđena, onda čita potreban broj znakova i stavlja ih u niz BEZ terminalnog znaka na kraju. |
s | Linija | Čita sve znakove bez razmaka. Ako je specificirana š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 zavisi od implementacije, ali je isti kao kako printf izlazi sa 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 | Pohranjuje 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.
#include
Pored funkcija scanf i printf, postoji niz funkcija koje vam omogućavaju primanje ulaznih podataka.
int gettch ()- vraća uneseni znak, ali ga ne ispisuje na konzolu. #includechar * fgets (char * str, int num, FILE * stream)- funkcija vam omogućava čitanje niza sa razmacima. Unatoč činjenici da radi s datotekom, možete je koristiti za čitanje standardni stream unos. Njegova prednost u odnosu na gets je u tome što vam omogućava da specificirate maksimalna veličina red koji se čita i završava red sa terminalnim znakom.
#include
Nije full set različite funkcije unos i izlaz karaktera. Postoji mnogo takvih funkcija, ali mnoge od njih nisu bezbedne, pa pažljivo pročitajte dokumentaciju pre upotrebe.
] SCANF #include
Kako je dobro kada su svi podaci dati, a ništa ne treba unositi. Ali, vjerujte mi, to se praktično ne dešava. Sjetite se škole, kada ste mjerili određene stvari, a zatim ste dobivene vrijednosti ubacivali u potrebne formule.
scanf
U jeziku C, pored printf izlazne funkcije, postoji i scanf funkcija za unos. Evo scanf funkcije upravo sada i mi ćemo detaljnije pogledati:
int i;
scanf ("% d", & i);
Izgleda vrlo slično funkciji printf. Također dostupno u dvostruki navodnici specifikacija formata, ali razlika je u drugom dijelu funkcije. Primijetili ste pojavu znaka (&)? Dakle, ovaj znak znači uzimanje adrese. Odmah ću objasniti zašto je to potrebno.
Unesenu vrijednost moramo napisati ne negdje tamo, već tačno na adresi na kojoj se nalazi naša varijabla. One. unsigned (&) naša unesena vrijednost će ići na sva mjesta osim na ono što nam je potrebno. Stoga, kad god trebate unijeti vrijednosti sa tastature, stavite znak adrese (&) ispred varijable.
Specifikatori formata
Pa sad idemo preko specifikacije formata:- % d - čitanje cijelog broja
- % o - čitanje oktalnog broja
- % x - čitanje heksadecimalnog broja
- % e (% f) - čitanje realnog broja
- % s - čitanje karaktera
- % s - red za čitanje
int i;
scanf ("% d", & i);
int i;
scanf ("% o", & i);
int i;
scanf ("% x", & i);
float 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 poređenja
Računar je prvobitno instaliran boolean 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 screen saver sastoji samo od ova dva magična broja.
Naravno, 0 i 1 su dobri, ali nam je potreban logički smisao, dakle logičke operacije 0 je LAŽ, a 1 je TAČNO. Ovi koncepti TAČNO i LAŽNO su usko povezani operacije poređenja... Za početak, evo svih vrsta operacija poređenja:
U osnovi, najčešća greška koju prave početnici je da pomiješaju operaciju dodjele (=). operacija poređenja(==). To su potpuno različite stvari. Ali na početku kodiranja svi imaju greške baš po ovoj osnovi, stoga budite oprezni.
Funkcija scanf () je procedura opće namjene koji čita stdin tok i pohranjuje informacije u varijablama specificiranim argumentima navedenim u listi argumenata. Može čitati sve ugrađene tipove podataka i automatski ih pretvarati u odgovarajući interni format.
C99 primjenjuje kvalifikator ograničenja na parametar formata.
Kontrolni niz specificiran parametrom formata sastoji se od tri kategorije znakova:
- specifikacije formata;
- razmaci;
- znakovi osim razmaka.
Specifikatori formata - kojima prethodi znak procenta (%) - govore vam koji tip podataka će se sljedeće čitati. Na primjer, specifikacija % s će pročitati string, a % d će pročitati cjelobrojnu vrijednost. Niz formata se čita s lijeva na desno, a specifikacije formata se poklapaju s argumentima navedenim u listi argumenata. Ovi kodovi su prikazani u sljedećoj tabeli.
Šifra | Imenovanje |
---|---|
%a | Čita vrijednost s pomičnim zarezom (samo C99) |
%A | Isto kao% kod (samo C99) |
%Sa | Čita jedan znak |
% d | Čita decimalni cijeli broj |
% i | Čita cijeli broj u bilo kojem formatu (decimalni, oktalni, heksadecimalni) |
% 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 red |
%X | Čita heksadecimalni broj |
% X | Slično kodu% x |
%R | Čita pokazivač |
% n | Prihvata cjelobrojnu vrijednost jednaku broju do sada pročitanih znakova |
% u | Čita decimalni cijeli broj bez predznaka |
% | Traži skup znakova |
%% | Čita znak postotka |
Podrazumevano, specifikacije a, f, e i g prisiljavaju scanf () da dodijeli podatke varijablama. float... Ako jednom od ovih specifikacija formata dodate modifikator l, scanf () će dodijeliti ono što je pročitao varijabli tipa duplo... Upotreba modifikatora L znači da je varijabla koja uzima vrijednost tipa long double.
Ako koristite moderan kompajler 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 sa tipom podataka whcar_t. Modifikator l se također može koristiti sa kodom formata s za označavanje pokazivača na dvobajtni niz znakova. Dodatno, l modifikator se može koristiti za izmjenu dvobajtnog skupa znakova koji se skenira.
Razmaci u nizu formata uzrokuju da scanf () preskoči jedan ili više 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 () pročita, ali ne i pohrani, 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 navedeni znak nije pronađen, 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 redovima. Znakovi kao što su zarez, tačka i zarez, itd. nisu prepoznati kao separatori. To znači da operater
Scanf ("% d% d", & r, & c);
prihvatit će vrijednosti unesene kao 10 20, ali će potpuno odbaciti "posudu" posluženu kao 10.20.
* iza znaka % i prije koda formata će pročitati podatke dati tip ali će zabraniti njihov zadatak. Dakle, operater
Scanf ("% d% * c% d", & x, & y);
prilikom unosa podataka u formu 10/20, vrijednost 10 će staviti u varijablu x, odbaciti znak dijeljenja i dodijeliti vrijednost 20 varijabli y.
Naredbe za formatiranje mogu sadržavati modifikator maksimalna dužina 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 ne želite pročitati više od 20 znakova u adresnu varijablu, koristite 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 funkcije scanf () "zaustavljen". Nakon detekcije razmak unos podataka za polje može se završiti prije nego se dostigne maksimalna dužina polja. U ovom slučaju, funkcija scanf () prelazi na čitanje sljedećeg polja.
Iako se razmaci, tabulatori i novi redovi koriste kao separatori polja, oni se čitaju kao i svaki drugi znak kada se pročita jedan znak. Na primjer, ako se ulazni tok sastoji od znakova x y, onda operator
Scanf ("% c% c% c", & a, & b, & c);
će postaviti znak x u varijablu a, razmak u varijablu b i znak y u varijablu c.
Imajte na umu da bilo koji drugi karakter kontrolna linija Specifikatori neformata (uključujući razmake, tabulatore i nove redove) se koriste za podudaranje i odbacivanje znakova iz ulaznog toka. Na primjer, ako ulazni tok izgleda kao 10t20, operator
Scanf ("% st% s", & x, & y);
staviće 10 u x i 20 u y. Znak t se odbacuje jer se pojavljuje u kontrolnoj liniji.
Drugi način korištenja funkcije scanf () naziva se scanset. U ovom 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. Otvaranje uglata zagrada mora odmah pratiti znak procenta. Na primjer, sljedeći skup skeniranih znakova ukazuje na to da samo znakove A, B i C treba pročitati.
% [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 niz će sadržavati niz pročitanih znakova završen nulom.
Ako je prvi znak u skupu znak za umetanje (^), onda dobijamo suprotan efekat: polje za unos se čita do prvog znaka iz datog skupa znakova, tj. znak za umetanje uzrokuje da scanf () prihvati sve znakove koji nisu definirani u skupu.
Mnogi prevodioci vam dozvoljavaju da navedete opseg sa 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 dođe do greške prije dodjeljivanja prvog polja, scanf () vraća EOF.
C99 je dodao modifikatore formata u scanf ().
C99 verzija dodaje nekoliko modifikatora formata za upotrebu 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 nepotpisane znakove. Modifikator ll se također može primijeniti na specifikacije d, i, o, i, x, i n. To znači da je odgovarajući argument pokazivač na vrijednost signed long long int ili unsigned long long int.
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. Ovi tipovi su deklarisani u zaglavlju
Modifikator z formata, 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. Ovaj tip je deklarisan 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. Ovaj tip je deklarisan u zaglavlju
Funkcija printf () omogućava ispis informacija na ekran prilikom programiranja u načinu rada konzole. Ova funkcija je definiran 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 ekran i može sadržavati posebne kontrolne znakove za prikaz varijabli. Nakon toga slijedi lista 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, printf () funkcija jednostavno ispisuje dati niz na ekran monitora:
printf (“Zdravo svijete.”);
Međutim, može se koristiti za prikaz varijabli različite vrste: počinje brojevima i završava se nizovima. Za izvođenje ove operacije koriste se posebni kontrolni znakovi, koji se nazivaju specifikacijama i koji počinju sa znakom %. Sljedeći primjer pokazuje izlaz cjelobrojne varijable num na ekran monitora pomoću funkcije printf ():
int num;
broj = 5;
printf (“% d”, broj);
Prva dva reda ovog programa definiraju varijablu pod nazivom num tipa int. Treći red ispisuje varijablu na ekran. Funkcija printf () izgleda ovako. Funkcija prvo analizira string koji će biti prikazan. V u ovom slučaju ovo je "% d". Ako ovaj red sadrži specifikaciju, tada se na njeno mjesto upisuje vrijednost varijable, koja je drugi argument funkcije printf (). Kao rezultat, umjesto originalna linija Na ekranu će se pojaviti "% D" linija "5", tj. biće prikazan broj 5.
Treba napomenuti da specifikacija "% d" daje samo cjelobrojne tipove varijabli, na primjer int. Druge specifikacije treba koristiti za izvođenje drugih tipova. Glavni tipovi specifikacija su navedeni u nastavku:
% s - jedan znak
% d - decimalni cijeli broj sa predznakom
% f - broj s pomičnim zarezom (decimalni zapis)
% s - niz znakova (za string varijable)
% u - decimalni cijeli broj bez predznaka
%% - ispisati znak postotka
Pomoću funkcije printf () možete ispisati nekoliko varijabli odjednom. Za to se koristi sljedeća konstrukcija:
int num_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:
num_i = 5, num_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 liniju, ali u koloni, tada funkcija printf () mora biti prepisana na sljedeći način:
printf (“num_i =% d, \ n num_f =% f”, num_i, num_f);
Znak tab se koristi na sličan način.
Za unos informacija s tastature zgodno 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 tipa ulaznih podataka i može sadržavati iste specifikacije kao funkcija printf (). Zatim, postoji lista neobaveznih argumenata. Listing 1.4 pokazuje kako scanf () radi.
Listing 1.4. Primjer korištenja funkcije scanf ().
#include
int main ()
{
int age;
težina plovka;
printf (“Unesite podatke o vašim godinama:”);
scanf (“% d”, & starost);
printf (“Unesite informacije o svojoj težini:”);
scanf (“% f”, & težina);
printf (“Vaše godine =% d, vaša težina =% f”, starost, težina);
Povratak 0;
}
Glavna razlika između upotrebe funkcije scanf () i funkcije printf () je znak & ispred imena varijable u koju se upisuju rezultati unosa.
Funkcija scanf () može raditi s nekoliko varijabli odjednom. Pretpostavimo da trebate unijeti dva cijela broja sa tastature. Formalno, za ovo možete dvaput pozvati funkciju scanf (), ali je bolje koristiti ovu konstrukciju:
scanf (“% d,% d”, & n, & m);
Funkcija scanf () ovo tumači kao da očekuje da korisnik unese broj, zatim zarez, a zatim drugi broj. Sve se dešava kao da treba da unesete dva cela broja na sledeći način:
Funkcija scanf () vraća broj uspješno pročitanih stavki. Ako se operacija čitanja nije dogodila, što se dešava kada, umjesto očekivanog digitalna vrijednost unese se bilo koje slovo, tada je povratna vrijednost 0.