Cum se configurează smartphone-uri și PC-uri. Portal informativ

Funcția Scanf C: descriere.

Cât de bine este când sunt date toate datele și nu trebuie introdus nimic. Dar, credeți-mă, acest lucru practic nu se întâmplă. Amintiți-vă de școală, când ați măsurat anumite lucruri, iar apoi valorile obținute au fost introduse în formulele necesare.

scanf

În limbajul C, pe lângă funcția de ieșire printf, există și funcția scanf pentru intrare. Iată funcția scanf chiar acum și vom arunca o privire mai atentă:

int i;
scanf ("% d", & i);

Pare foarte asemănător cu funcția printf. Tot între ghilimele duble specificator de format, dar diferența este în a doua parte a funcției. Ați observat apariția semnului (&)? Deci acest semn înseamnă luarea adresei. Chiar acum voi explica de ce este nevoie de acest lucru.

Trebuie să scriem valoarea introdusă nu undeva acolo, ci exact la adresa la care se află variabila noastră. Acestea. nesemnată (&) valoarea noastră introdusă va merge în toate locurile, cu excepția celor de care avem nevoie. Prin urmare, ori de câte ori trebuie să introduceți valori de la tastatură, puneți un semn de adresă (&) în fața variabilei.

Specificatorii de format

Ei bine, acum să trecem specificatorii de format:
  1. % d - citire întreg
  2. int i;
    scanf ("% d", & i);

  3. % o - citește numărul octal
  4. int i;
    scanf ("% o", & i);

  5. % x - citește un număr hexazecimal
  6. int i;
    scanf ("% x", & i);

  7. % e (% f) - citește numărul real
  8. float t;
    scanf ("% f", & t);

  9. % s - caracter citit
  10. char ch;
    scanf ("% c", & ch);

  11. % s - linie de citire
  12. char * str ;;
    scanf ("% s", str);

    Nu te apuca să lucrezi cu șiruri încă. De ce nu există niciun semn de a lua adresa? Vom analiza acest subiect puțin mai târziu.

Operatii de comparatie

Logica booleană este inițial încorporată în computer, adică. totul este construit pe 0 și 1. Dacă nu înțelegeți despre ce este vorba, atunci urmăriți filmul The Matrix, în care fiecare economizor de ecran verde era format din aceste două numere magice.

Desigur, 0 și 1 sunt bune, dar avem nevoie de sens logic, deci în operațiile booleene 0 este FALS și 1 este ADEVĂRAT. Aceste concepte TRUE și FALSE sunt strâns legate de operatii de comparatie... Pentru început, iată tot felul de operații de comparație:

Practic, cea mai frecventă greșeală pe care o fac începătorii este să confunde operațiunea de atribuire (=) cu operatie de comparatie(==). Acestea sunt lucruri complet diferite. Dar la începutul codificării, toată lumea are erori chiar pe această bază, așa că aveți grijă.

Vă rugăm să suspendați AdBlock pe acest site.

Să revenim la ultima listă a pasului anterior:

Listarea 1.

#include int main (void) (int a, b, res; a = 10; b = 7; res = a + b; printf ("% d +% d =% d \ n", a, b, res); return 0;)

Sarcina principală a acestui pas este să înveți cum să obții date de la utilizator.

Funcția scanf poate fi folosită pentru aceasta. Ea, ca și funcția printf, este descrisă în fișierul antet stdio.h. pentru că îl avem deja conectat în prima linie, apoi putem folosi liber funcția scanf din programul nostru.

Fig. 1. Sintaxă generală pentru scanf.

Ghilimelele duble indică specificatorul de format. În funcție de variabila în care vom stoca valoarea introdusă, trebuie să folosim specificatorul de format corespunzător.

Specificatori de format de bază:

% d- numere întregi
% f- numărul real de tip float
% lf- un număr real de tip dublu (notația lf din long float)
% c- simbol

Rețineți că funcția scanf folosește specificatori de format diferiți pentru tipurile float și double.

După șirul de format, trebuie să specificați adresa variabilei în care doriți să salvați datele. Pentru a indica adresa unei variabile, este suficient să scrieți semnul & (ampersand) în fața numelui acesteia, ca în figura de mai sus.

În cele din urmă, să scriem un program pentru adăugarea a două numere.

Lista 2.

#include int main (void) (int a, b, res; scanf ("% d", & a); // citește valoarea întreagă în variabila a scanf ("% d", & b); // citește valoarea întreagă în variabilă b res = a + b; printf ("% d +% d =% d \ n", a, b, res); return 0;)

Compilați și rulați acest program. După lansarea programului, acesta va aștepta să introduceți date. Știm ce date trebuie să introduceți, pentru că am scris acest program. Pentru alți utilizatori care nu vor vedea codul programului, ar fi bine să afișeze un indiciu pe ecran ce date să introducă. Vedeți cum se face acest lucru în exemplul următor.

Acest program va fi util celor care își monitorizează starea de sănătate. Acest program calculează rata metabolică bazală folosind formula Mifflin-Saint Geor pe baza datelor pe care le introduceți (vârsta, înălțimea și greutatea).

Lista 3.

#include int main (void) (int vârsta, înălțimea, greutatea; dublu bov_m, bov_f; printf ("Vash vozrast? (zeu) \ n"); scanf ("% d", & vârstă); // citește valoarea întreagă în variabila vârstă printf ("Vash rost? (cm) \ n"); scanf ("% d", & înălțime); // citiți valoarea în variabila înălțime printf ("Vash ves? (kg) \ n") ; scanf ("% d ", & greutate); // citiți valoarea în variabila greutate bov_m = 10 * greutate + 6,25 * înălțime - 5 * vârstă + 5; bov_f = 10 * greutate + 6,25 * înălțime - 5 * vârstă - 161; printf (" | BMR | \ n "); printf (" | bărbat | femeie | \ n "); printf (" |% 8.2f |% 8.2f | \ n ", bov_m, bov_f); return 0 ;)

De fapt, funcția scanf este o funcție de introducere a formatului. Este aproape mai complex decât printf. Dar a-i spune unui începător despre particularitățile muncii ei înseamnă în zadar să-l încarci cu informații inutile. În această etapă, aceste cunoștințe vă vor fi suficiente și, atunci când devine necesar să folosiți ceva mai mult, vă puteți da seama singur. Sau poate îți voi spune într-o lecție.

Biblioteca standard C/C++ include o serie de funcții pentru citirea și scrierea pe consolă (tastatură și monitor). Aceste funcții citesc și scriu date ca un simplu flux de caractere.

Conceptul de flux (flux), folosit în programare, este strâns legat de înțelegerea obișnuită, de zi cu zi, a cuvântului. Debitul de intrare poate fi comparat cu o conductă prin care apa (informația) intră în piscină (memoria computerului), debitul de ieșire - cu o conductă prin care apa iese din piscină. O caracteristică importantă a acestei conducte este că datele se pot deplasa doar într-o direcție la un moment dat. Chiar dacă se folosește aceeași țeavă pentru intrare și ieșire, acest lucru nu se poate întâmpla în același timp: pentru a comuta direcția de curgere, aceasta trebuie oprită, trebuie efectuate unele acțiuni și numai atunci fluxul trebuie direcționat în sens opus. . O altă caracteristică a fluxului este că aproape niciodată nu se usucă. Uneori se usucă, dar această perioadă nu poate fi lungă dacă sistemul funcționează normal.

Funcția standard de ieșire printf ()

Funcția printf () este o funcție standard de ieșire. Folosind această funcție, puteți afișa un șir de caractere, un număr, o valoare variabilă...

Funcția printf () are un prototip în fișierul stdio.h
int printf (char * șir de control, ...);

Dacă reușește, funcția printf () returnează numărul de caractere tipărite.

Șirul de control conține două tipuri de informații: caractere, care sunt imprimate direct pe ecran și specificatorii de format, care determină modul de afișare a argumentelor.

Funcția printf () este o funcție de ieșire formatată. Aceasta înseamnă că în parametrii funcției, trebuie să specificați formatul datelor care vor fi scoase. Formatul datelor este indicat de specificatorii de format. Specificatorul de format începe cu un caracter% urmat de un cod de format.

Specificatori de format:

%Cu simbol
% d zecimal întreg
% i zecimal întreg
% e număr zecimal sub forma x.xx e + xx
% E număr zecimal sub forma x.xx E + xx
% f
% F virgulă mobilă zecimală xx.xxxx
% g % f sau% e, oricare dintre acestea este mai scurtă
% G % F sau % E, oricare dintre acestea este mai scurtă
% o număr octal
% s șir de caractere
% u număr zecimal fără semn
% X număr hexazecimal
% X număr hexazecimal
%% simbol %
% p indicator
% n indicator

În plus, modificatorii l și h pot fi aplicați comenzilor de formatare.

% ld print int lung
% hu imprimare scurtă nesemnată
% Lf imprimeu dublu lung

În specificatorul de format, după simbolul % poate fi specificată o precizie (numărul de cifre după virgulă zecimală). Precizia se stabileste astfel:% .n<код формата>... Unde n este numărul de cifre după virgulă zecimală și<код формата>- unul dintre codurile date mai sus.

De exemplu, dacă avem o variabilă x = 10,3563 de tip float și dorim să afișăm valoarea acesteia cu precizie de până la 3 cifre după virgulă, atunci ar trebui să scriem:

printf ("Variabila x =% .3f", x);

Rezultat:
Variabila x = 10,356

De asemenea, puteți specifica marginea minimă imprimabilă. Dacă linia sau numărul este mai mare decât lățimea câmpului specificată, atunci întreaga linie sau numărul este tipărită.

De exemplu, dacă scrieți:

printf ("% 5d", 20);

atunci rezultatul va fi următorul:
20

Rețineți că numărul 20 nu a fost tipărit chiar de la începutul rândului. Dacă doriți ca spațiile neutilizate ale câmpului să fie umplute cu zerouri, atunci trebuie să puneți caracterul 0 în fața lățimii câmpului.

De exemplu:

printf ("% 05d", 20);

Rezultat:
00020

Pe lângă specificatorii de format de date, șirul de control poate conține caractere de control:

\ b BS, fund
\ f Pagina nouă, traducere pagină
\ n Linie nouă, flux de linie
\ r Retur transport
\ t Filă orizontală
\ v Filă verticală
\" Citat dublu
\" Apostrof
\\ Backslash
\0 Caracter nul, octet nul
\ A Semnal
\ N Constanta octala
\ xN Constanta hexazecimala
\? Semnul întrebării

Cel mai adesea veți folosi caracterul \ n. Cu acest caracter de control veți putea să faceți un avans de linie. Priviți exemplele de programe și veți înțelege totul.

Exemple de programe.

/ * Exemplul 1 * /
#include

void main (void)
{
int a, b, c; // Declararea variabilelor a, b, c
a = 5;
b = 6;
c = 9;
printf ("a =% d, b =% d, c =% d", a, b, c);
}

Rezultatul programului:
a = 5, b = 6, c = 9

/ * Exemplul 2 * /
#include

void main (void)
{
plutește x, y, z;

X = 10,5;
y = 130,67;
z = 54;

Printf ("Coordonatele obiectului: x:%. 2f, y:%. 2f, z:%. 2f", x, y, z);
}

Rezultatul programului:
Coordonatele obiectului: x: 10.50, y: 130.67, z: 54.00

/ * Exemplul 3 * /
#include

void principal ()
{
int x;

X = 5;
printf ("x =% d", x * 2);
}

Rezultatul programului:
x = 10

/ * Exemplul 4 * /
#include

void main (void)
{
printf ("\" Text între ghilimele \ "");
printf ("\ nConținut de oxigen: 100 %%");
}

Rezultatul programului:
„Text între ghilimele”
Conținut de oxigen: 100%

/ * Exemplul 5 * /
#include

void main (void)
{
int a;

A = 11; // 11 zecimale este egal cu b hexazecimal
printf ("a-dec =% d, a-hex =% X", a, a);
}

Rezultatul programului:
a-dec = 11, a-hex = b

/ * Exemplul 6 * /
#include

void main (void)
{
char ch1, ch2, ch3;

Ch1 = "A";
ch2 = „B”;
ch3 = "C";

Printf ("% c% c% c", ch1, ch2, ch3);
}

Rezultatul programului:
ABC

/ * Exemplul 7 * /
#include

void main (void)
{
char * str = "Șirul meu.";

Printf ("Acesta este% s", str);
}

Rezultatul programului:
Aceasta este linia Mea.

/ * Exemplul 8 * /
#include

void main (void)
{
printf ("Bună ziua! \ n"); // După imprimare, va apărea o nouă linie - \ n
printf ("Numele meu este Pavel."); // Aceasta va fi tipărită pe o nouă linie
}

Rezultatul programului:
Salut!
Numele meu este Pavel.

Scanf () funcție de intrare standard

Funcția scanf () este o funcție de intrare formatată. Cu ajutorul acestuia, puteți introduce date de la un dispozitiv de intrare standard (tastatură). Datele de intrare pot fi numere întregi, numere în virgulă mobilă, caractere, șiruri și pointeri.

Funcția scanf () are următorul prototip în fișierul stdio.h:
int scanf (char * șir de control);

Funcția returnează numărul de variabile cărora le-a fost atribuită o valoare.

Șirul de control conține trei tipuri de caractere: specificatori de format, spații și alte caractere. Specificatorii de format încep cu un caracter %.

Specificatori de format:

Când introduceți un șir folosind funcția scanf () (specificatorul de format% s), șirul este introdus înainte de primul spațiu !! acestea. dacă introduceți rândul „Bună lume!” folosind funcția scanf ().


scanf ("% s", str);

apoi, după introducere, șirul rezultat, care va fi stocat în matricea str, va consta dintr-un cuvânt „Bună ziua”. FUNCȚIA INSERE O LINIE ÎNAINTE PRIMUL SPAȚIU! Dacă doriți să introduceți linii cu spații, atunci utilizați funcția

char * gets (char * buf);

Cu funcția gets (), puteți introduce șiruri complete. Funcția gets () citește caracterele de la tastatură până când apare un caracter newline (\ n). Caracterul newline în sine apare când apăsați enter. Funcția returnează un pointer către buf. buf este un buffer (memorie) pentru șirul de intrare.

Deși gets () este în afara domeniului de aplicare al acestui articol, haideți să scriem un exemplu de program care vă permite să introduceți o linie întreagă de la tastatură și să o afișați pe ecran.

#include

void main (void)
{
tampon de carbon; // matrice (buffer) pentru șirul de intrare

Obține (buffer); // introduceți o linie și apăsați enter
printf ("% s", buffer); // afișează linia introdusă pe ecran
}

Încă o notă importantă! Pentru a introduce date folosind funcția scanf (), trebuie să îi transmiteți adresele variabilelor ca parametri, și nu variabilele în sine. Pentru a obține adresa unei variabile, trebuie să plasați semnul & (ampersand) în fața numelui variabilei. Semnul & înseamnă a lua o adresă.

Ce înseamnă adresa? Voi încerca să explic. Avem o variabilă în program. O variabilă își stochează valoarea în memoria computerului. Deci adresa pe care o obținem cu & este adresa din memoria computerului în care este stocată valoarea variabilei.

Să aruncăm o privire la un exemplu de program care ne arată cum să folosim &

#include

void main (void)
{
int x;

Printf ("Introduceți variabila x:");
scanf ("% d", & x);
printf ("Variabila x =% d", x);
}

Acum să revenim la linia de control scanf (). Din nou:

int scanf (char * șir de control);

Un caracter de spațiu pe o linie de control indică să omiteți unul sau mai multe spații în fluxul de intrare. Pe lângă un spațiu, poate fi perceput un caracter de tabulație sau de nouă linie. Un caracter diferit de zero indică citirea și eliminarea acestui caracter.

Delimitatorii dintre două numere introduse sunt spațiu, tabulator sau linie nouă. * după% și înainte de codul de format (specificator de format) indică citirea datelor de tipul specificat, dar nu atribuiți această valoare.

De exemplu:

scanf ("% d% * c% d", & i, & j);

tastând 50 + 20 va seta i la 50, j la 20, iar + va fi citit și ignorat.

Comanda format poate specifica cea mai mare lățime a câmpului de citit.

De exemplu:

scanf ("% 5s", str);

indică dacă să citiți primele 5 caractere din fluxul de intrare. Dacă introduceți 1234567890ABC, matricea str va conține doar 12345, restul caracterelor vor fi ignorate. Separatoare: spațiu, tab și newline - atunci când sunt introduse, sunt tratate ca toate celelalte caractere.

Dacă se găsesc alte caractere în șirul de control, acestea sunt destinate să identifice și să ignore caracterul corespunzător. Flux de caractere 10plus20 de către operator

scanf ("% dplus% d", & x, & y);

va seta x la 10, y la 20 și va omite caracterele plus, deoarece acestea apar în linia de control.

Una dintre caracteristicile puternice ale funcției scanf () este capacitatea de a specifica un set de scanare. Setul de căutare definește setul de caractere cu care vor fi comparate caracterele citite de funcția scanf (). Funcția scanf () citește caractere atâta timp cât acestea apar în setul de căutare. De îndată ce caracterul introdus nu apare în setul de căutare, scanf () trece la următorul specificator de format. Setul de căutări este determinat de o listă de caractere cuprinse între paranteze drepte. O paranteză deschisă este precedată de semnul %. Să aruncăm o privire la asta cu un exemplu.

#include

void main (void)
{
char str1, str2;
scanf ("%% s", str1, str2);
printf ("\ n% s \ n% s", str1, str2);
}
Să introducem un set de simboluri:
12345abcdefg456

Pe ecran, programul va afișa:
12345
abcdefg456

Când specificați un set de căutări, puteți utiliza și caracterul cratimă pentru a specifica spațierea, precum și lățimea maximă a câmpului de introducere.

scanf ("% 10", str1);

De asemenea, puteți defini caractere care nu sunt incluse în setul de căutare. Primul dintre aceste caractere este precedat de un ^. Setul de caractere face distincția între literele mici și mari.

Permiteți-mi să vă reamintesc că atunci când utilizați funcția scanf (), trebuie să îi transmiteți adresele variabilelor ca parametri. Codul de mai sus a fost scris:

char str; // o matrice de 80 de caractere
scanf ("% s", str);

Rețineți că str nu este precedat de &. Acest lucru se datorează faptului că str este o matrice, iar numele matricei, str, este un pointer către primul element al matricei. Prin urmare, semnul & nu este folosit. Deja transmitem adresa către scanf (). Ei bine, pur și simplu, str este adresa din memoria computerului în care va fi stocată valoarea primului element al matricei.

Exemple de programe.

Exemplul 1.
Acest program afișează interogarea „Câți ani ai?:” și așteaptă ca datele să fie introduse. Dacă, de exemplu, introduceți numărul 20, programul va afișa rândul „Ai 20 de ani”. Când apelăm funcția scanf (), punem semnul & în fața variabilei de vârstă, deoarece funcția scanf () are nevoie de adresele variabilelor. Funcția scanf () va scrie valoarea introdusă la adresa specificată. În cazul nostru, valoarea introdusă 20 va fi scrisă la adresa variabilei vârstă.

/ * Exemplul 1 * /

#include

void main (void)
{
int vârsta;

Printf ("\ nCâți ani ai?:");
scanf ("% d", & vârstă);
printf („Ai % d ani.”, vârsta);
}

Exemplul 2.
Programul calculatorului. Acest calculator poate adăuga doar numere. Dacă introduceți 100 + 34, programul va da rezultatul: 100 + 34 = 134.

/ * Exemplul 2 * /

#include

void main (void)
{
int x, y;

Printf ("\ nCalculator:");
scanf ("% d +% d", & x, & y);
printf ("\ n% d +% d =% d", x, y, x + y);
}

Exemplul 3.
Acest exemplu arată cum să setați lățimea de citire. În exemplul nostru, lățimea câmpului este de cinci caractere. Dacă introduceți un șir cu un număr mare de caractere, atunci toate caracterele de după al 5-lea vor fi eliminate. Observați apelul la funcția scanf (). Semnul & nu precede numele numelui matricei deoarece numele numelui matricei este adresa primului element din matrice.

/ * Exemplul 3 * /

#include

void main (void)
{
nume char;

Printf ("\ nIntroduceți numele dvs. de utilizator (nu mai mult de 5 caractere):");
scanf ("% 5s", nume);
printf ("\ nAi introdus% s", nume);
}

Exemplul 4.
Ultimul exemplu din acest articol arată cum puteți utiliza mai multe căutări. După pornirea programului, introduceți un număr de la 2 la 5.

/ * Exemplul 4 * /

#include

void main (void)
{
char bal;

Printf ("Evaluarea dvs. este 2,3,4,5:");
scanf ("%", & bal);
printf ("\ nEvaluare% c", bal);
}

Funcția scanf () este o rutină de intrare de uz general care citește date din fluxul stdin. Poate citi date de toate tipurile de bază și le poate converti automat în formatul intern dorit. Dacă printf () făcea intrare mai degrabă decât ieșire, ar putea fi numit un analog al scanf ().

Șirul de control indicat de format este format din trei tipuri de caractere:

  • Specificatorii de format
  • Simboluri speciale
  • Alte personaje (nu speciale)

Specificatorii de format urmează caracterul procentual și spun scanf () ce tip de date să citească în continuare. Codurile specificatorului sunt prezentate în tabel.

Tabel: coduri de format pentru scanf ()
Codul Sens
%Cu Numărați un caracter
% d
% i Citiți zecimal întreg
% e
% f Citiți numărul în virgulă mobilă
% g Citiți numărul în virgulă mobilă
%O Numărați numărul octal
% s Citeste linia
%X Citiți numărul hexazecimal
%R Citiți indicatorul
% n Acceptă o valoare întreagă egală cu numărul de caractere citite până în momentul curent
% u Citește un întreg fără semn
% Caută un set de caractere
%% Citește caracterul %

De exemplu, % s citește un șir, iar % d citește o variabilă întreagă.

Șirul de format este citit de la stânga la dreapta, mapare între codurile de format și argumentele din lista de argumente.

Caracterele speciale din șirul de control fac ca scanf () să ignore unul sau mai multe caractere speciale în fluxul de intrare. Caracterele speciale sunt spațiu, tabulator sau linie nouă. Un singur caracter special pe o linie de control face ca scanf () să citească, fără a-și aminti, orice număr (inclusiv zero) de caractere speciale învecinate din fluxul de intrare, până când este întâlnit un caracter nespecial.

Prezența unui caracter obișnuit face ca scanf () să citească și să renunțe la caracterul corespunzător. De exemplu, „% d,% d” face ca scanf () să citească un întreg, să citească și să renunțe la virgula și apoi să citească un alt întreg. Dacă caracterul specificat nu este găsit în fluxul de intrare, scanf () se oprește.

Toate variabilele utilizate pentru a primi valori folosind funcția scanf () trebuie căutate după adresele lor. Aceasta înseamnă că toate argumentele funcției trebuie să fie pointeri către variabile. Astfel, C face posibilă trecerea prin referință, iar acest lucru permite funcției să schimbe conținutul argumentului.

Scanf ("% d", & număr);

Șirurile sunt citite în matrice de caractere, iar numele matricei, fără niciun pointer, este adresa primului element din matrice. Prin urmare, pentru a citi un șir în matricea de caractere de adresă, puteți utiliza comanda

Scanf ("% s", adresa);

În acest caz, adresa numelui este deja un pointer și nu are nevoie de prefixul &.

Elementele de date introduse trebuie separate prin spații, file sau linii noi.
Caracterele de punctuație precum virgulă, punct și virgulă etc. nu sunt considerate ca delimitatori. Aceasta înseamnă că pentru operator

Scanf ("% d% d", & r, & c);

Secvența 10 20 va fi acceptată, dar secvența 10.20 nu. Specificatorii de format scanf () sunt în aceeași ordine cu variabilele din lista de argumente cărora le sunt alocate valorile variabilelor primite.

* după % și înainte de specificatorul de format citește datele de tipul specificat, dar suprimă atribuirea. Deci codul

Scanf ("% d% * c% d", & x, & y);

Când introduceți secvența, 10/20 atribuie 10 lui x, elimină / și atribuie 20 lui y.

Comenzile de formatare pot seta modificatorul lățimii maxime a câmpului. Este un număr întreg care este plasat între semnul% și specificatorul de format. Limitează numărul de caractere citite pentru orice câmp. De exemplu, dacă trebuie să citiți nu mai mult de 20 de caractere în matricea de adrese, ați scrie

Scanf ("% 20s", adresa);

Dacă fluxul de intrare conține mai mult de 20 de caractere, atunci la un apel ulterior, funcția de introducere va începe intrarea din punctul în care intrarea a fost oprită în timpul apelului curent. Introducerea câmpului poate fi întreruptă înainte de a atinge lungimea maximă a câmpului dacă se întâlnește un spațiu liber. În acest caz, scanf () trece la câmpul următor.

Deși spațiile, tabulatorii și liniile noi sunt folosite ca separatori de câmp, ele sunt citite ca orice alt caracter atunci când este introdus un singur caracter. De exemplu, având în vedere un flux de intrare x y, funcția

Scanf ("% c% c% c", & a, & b, & c);

Va plasa caracterul x în variabila a, spațiu - în variabila b și y - în variabila c.

Fiți atenți: orice alte caractere din linia de control - inclusiv spații, tabulații și linii noi - sunt folosite pentru a specifica și elimina caracterele din fluxul de intrare. De exemplu, pentru un flux de intrare de 10t20, funcția

Scanf ("% st% s", & x, & y);

Plasează 10 în x și 20 în y. T va fi aruncat deoarece există un t în linia de control.

O altă caracteristică a funcției scanf () se numește scanări multiple. Setul de scanare definește caracterele care vor fi citite de funcția scanf () și alocate elementelor matricei de caractere corespunzătoare. Pentru a specifica un set de scanări, trebuie să puneți caracterele, care sunt valide, între paranteze drepte. Prima paranteză pătrată este precedată de un semn de procent. De exemplu, următoarea listă de seturi de scanare specifică faptul că scanf () citește doar caracterele A, B și C:

Argumentul corespunzător listei de seturi de scanare trebuie să fie un pointer către o matrice de caractere. Când utilizați scanări multiple, funcția scanf () citește caractere și le plasează în matricea specificată până când este întâlnit un caracter care nu este inclus în setul de scanare (adică sunt citite doar caracterele incluse în setul de scanare).

Matricea returnată de scanf () va conține un șir terminat cu nul. Lista simbolurilor care pot fi citite poate fi setată și în formă inversă. Pentru a face acest lucru, plasați ^ ca prim caracter. Apoi scanf () va accepta orice caracter care nu este inclus în setul de scanare.

Folosind ghilimele, puteți specifica intervalul de caractere care trebuie interpretat. De exemplu, următoarea expresie indică scanf () să accepte literele de la A la Z:

O mulțime de scanări fac diferența între litere mari și mici. Dacă doriți ca scanf () să le accepte pe ambele, trebuie să le enumerați separat în setul de scanări.

Funcția scanf () returnează un număr egal cu numărul de câmpuri ale căror valori au fost efectiv atribuite variabilelor. Acest număr nu include câmpurile care au fost citite, dar valorile lor nu au fost atribuite la nimic din cauza utilizării modificatorului * pentru a suprima atribuirea. Dacă apare o eroare înainte de a atribui o valoare primului câmp, este returnat EOF.

Când utilizați Borland C ++ într-un mediu de 16 biți, puteți modifica modelul de memorie implicit pentru compilarea programului dvs. specificând în mod explicit dimensiunea fiecărui pointer folosit la apelarea scanf (). Indicatorul de aproape este specificat de modificatorul N, iar indicatorul de departe de modificatorul F (Nu puteți utiliza modificatorul N dacă programul este compilat pentru modelul de memorie uriașă.)

] SCANF #include int scanf (șir de format [[, argument ...]]); char * format-string. șir de control al formatului. Descriere. Scanf citește datele din stdin în locația specificată de argumente. Fiecare argument trebuie să fie un pointer către o valoare cu un tip care se potrivește cu tipul specificat în șirul de format. Șirul de format controlează transformările câmpurilor de intrare. Acest șir poate conține următoarele: caractere „spații albe”, adică caracterul de spațiu „”, tab \ t, linie nouă „\ n”. Pentru scanf, se folosește un caracter spațiu pentru a citi, dar nu a reține, toate caracterele spațiale introduse ulterioare, până la primul caracter fără spațiu. Pe măsură ce tastați, un caracter spațiu din șirul de format se potrivește cu orice număr, inclusiv 0, sau cu orice combinație de caractere spațiu. Orice caracter de control, altul decât un spațiu și un caracter de semn procentual%. Apoi acest simbol pentru funcția scanf este determinat prin citire, dar fără a stoca simbolurile de control corespunzătoare. Dacă următorul personaj în nu se potrivește cu caracterele de control, apoi scanf iese. Specificația de format a fost introdusă cu semnul %. În acest caz, scanf citește și convertește caracterele introduse în valori de tipul specificat, cu valorile determinate de argumentele corespunzătoare din lista de argumente. Șirul de format este citit de la stânga la dreapta. Se presupune că caracterele din afara specificației de format sunt în concordanță cu secvența de caractere din fluxul stdin; aceste caractere potrivite în stdin sunt scanate, dar nu sunt amintite. Dacă un caracter din stdin intră în conflict cu șirul de format, scanf iese. Acest caracter conflictual rămâne în stdin deoarece nu poate fi citit. Când este întâlnită prima specificație de format, atunci valoarea primului câmp de intrare este convertită conform specificației de format și stocată în locația specificată de primul argument. Conform celei de-a doua specificații de format, al doilea câmp de intrare este convertit și stocat de al doilea argument; și așa mai departe până la sfârșitul șirului de format. Câmpul de introducere este delimitat de primul caracter „spațiu alb”, sau primul caracter care nu poate fi convertit în formatul specificat, sau de cazul atingerii câmpului de lățime care vine primul. Dacă sunt date mai multe argumente pentru specificația formatului selectat decât sunt necesare, atunci argumentele suplimentare sunt ignorate. Specificația formatului ia următoarea formă. % <.precision><{F:N:h:I}> ... Fiecare câmp din formatul BOM este un caracter sau un număr separat care exprimă o opțiune de format separată. Caracterul de tip care apare după ultimul câmp de format opțional identifică tipul câmpului de intrare ca caracter, șir sau numeric. Cel mai simplu format BOM conține doar un semn de procent și un simbol de tip (de exemplu, % S). Fiecare câmp al specificației de format este descris mai jos. Dacă semnul procentual% este urmat de un caracter care nu este un caracter de control al formatului, atunci acest caracter și caracterele care îl urmează, până la următorul semn%, sunt tratate ca o secvență obișnuită de caractere, adică secvența care urmează să fie introdusă. De exemplu, pentru a introduce caracterul semnului %, utilizați %%. Asteriscul (*) care urmează semnului % suprimă desemnarea următorului câmp de intrare, care este specificat ca un câmp specificat după tip. Acest câmp este scanat, dar nu este amintit. Widht este un întreg zecimal pozitiv și controlează numărul maxim de caractere citite din stdin. Numai acele caractere care nu depășesc lățimea sunt transformate și reținute de argumentul corespunzător. Dacă există caractere cu spații albe în lățime, de ex. caractere de spațiu, tabulator sau linie nouă, acestea nu sunt convertite în formatul selectat până când nu se atinge lățimea. Prefixele opționale F și N nu respectă convenția implicită de adresare a modelelor de memorie utilizate. F poate fi un prefix al argumentului care indică un obiect îndepărtat; și N la obiectul apropiat. Prefixul opțional l indică faptul că este utilizată versiunea lungă; iar prefixul h indică utilizarea versiunii scurte. Argumentul corespunzător indică un obiect lung sau dublu (folosind prefixul l) sau un obiect scurt (folosind prefixul h). Modificatorii l și h pot fi utilizați împreună cu tipurile de caractere d, i, o, x, u. Modificatorul l poate fi folosit și cu caracterele de tip e și f. Dacă este specificat orice alt tip, modificatorii l și h sunt ignorați. Simbolurile tip și semnificațiile acestora sunt descrise în Tabelul R.4. Tabelul R.4 Tipuri de caractere de scanf CARACTER TIP SUGERAT TIP DE INTRARE ARGUMENT d zecimal întreg pointer către int. D indicator întreg zecimal la lung. o indicator cu număr întreg octal către int. O indicator întreg octal către lung. x este un indicator hex către un int. întreg X indicator hex la lung. integer i decimal, a opta este un pointer către int. măsură sau număr întreg hexazecimal I zecimal, indicator octal la lung. un întreg fuzionat sau hexazecimal u indicator zecimal fără semn către un întreg fără semn int. U indicator zecimal fără semn la un întreg fără semn lung. e este o valoare în virgulă mobilă, un indicator către un al-lea punct flotant, care conține un semn opțional ("+", "-"), una sau mai multe cifre zecimale, conținând de obicei o virgulă zecimală și un exponent ("e "," E "), care este scris după o valoare întreagă cu semn. caracterul c. Un indicator de caracter către caractere Spațiu, tabulator sau caractere newline, așa-numitele „spații albe”, care sunt de obicei ignorate, sunt citite atunci când este specificat acest tip. % 1s este folosit pentru a citi următorul caracter fără spații albe. s șir. un indicator către o matrice de caractere suficient de mare pentru câmpul de intrare, împreună cu un terminator nul „\ 0” care apare automat. n citirea la intrare a unui pointer către int, în din stream sau din care este scris tamponul, dar contează cu succes. caractere dintr-un flux sau un buffer, până la și inclusiv cele specificate în apelul scanf. Valoarea p în forma pointer către far- xxxx: aaaa, unde este grupul de date. cifrele x și y sunt cifre hexazecimale majuscule. La citirea șirurilor de caractere care nu sunt delimitate de caractere albe, setul de caractere dintre paranteze pătrate trebuie înlocuit cu șirul de tip s. Câmpul de intrare corespunzător este citit până la primul caracter care nu este conținut în setul de caractere delimitat de paranteze drepte. Dacă primul caracter din acest set este caret (^), rezultatul este salvat: câmpul de introducere este citit până la primul caracter care nu este inclus în acest set de caractere. Pentru a reține un șir fără caracterul nul „\ 0”, este utilizată specificația % nc, unde n este un întreg zecimal. În acest caz, tipul de caracter s definește un argument care indică o matrice de caractere. Următoarele n caractere sunt citite din fluxul de intrare în locația specificată și caracterul nul nu este scris. Funcția scanf scanează caracter cu caracter pentru fiecare câmp de introducere. Se poate termina citirea unui singur câmp când atinge un caracter de spațiu, dacă este atins fie câmpul de lățime; sau următorul caracter de intrare nu poate fi convertit în formatul specificat; sau următorul caracter intră în conflict cu caracterul său corespunzător din șirul de control al formatului; sau următorul caracter lipsește din setul de caractere selectat. Când are loc procesul de sfârșit de citire dictat, următorul câmp de intrare este luat în considerare de la primul caracter conflictual. Acest caracter, dacă există unul, este tratat ca necitit, fie ca primul caracter al următorului câmp de intrare, fie ca primul caracter în citirile ulterioare din fluxul stdin. Valoare returnată. Această funcție returnează numărul de câmpuri convertite și atribuite cu succes. Valoarea returnată nu conține numărul de câmpuri citite, dar nealocate. EOF este returnat atunci când încercați să citiți sfârșitul fișierului. O valoare returnată de 0 indică faptul că nu există câmpuri alocate. Vezi și fscanf, printf, sscanf, vfprintf, vprintf, vsprintf. Exemplul 1. #include int i; float fp; char c, s; scanf ("% d% f% c% s", & i, & fp, & c, s); / * introducerea diferitelor date * /. Exemplul 2. #include main () / * convertiți numărul întreg hexazecimal ** sau octal în ** întreg zecimal * / (int numassigned, val; pintf ("Introduceți # hexazecimal sau octal sau 00 în guit: \ n"); do (printf ("# = "); numassigned = scanf ("% i ", & val); printf (" Decimal # =% i \ n ", nal);) while (val && numassigned); / * sfârșitul buclei dacă valoarea de intrare este 00 , sau dacă scanf nu poate atribui câmpul * /.) Atunci rezultatul va fi după cum urmează. Introduceți # hexazecimal sau octal, sau 00 pentru guit: # = 0xf # zecimal = 15 # = 0100 # zecimal = 64 # = 00 # zecimal = 0.

Top articole similare