Descrierea funcției Scanf C
Descrierea funcției Scanf C

Video: Descrierea funcției Scanf C

Video: Descrierea funcției Scanf C
Video: Dinastia Qin, începuturile Chinei Imperiale * Confucius și confucianism și constructia puterii 2024, Mai
Anonim

În acest articol, funcția scanf() este considerată într-o formă generală, fără referire la un standard specific, astfel încât datele din orice standard C99, C11, C++11, C++14 sunt incluse aici. Poate că, în unele standarde, funcția funcționează cu diferențe față de materialul prezentat în articol.

Funcția C scanf - descriere

scanf() este o funcție situată în fișierele antet stdio.h(C) și cstdio(C++), cunoscută și sub numele de intrare de program formatat. scanf citește caractere din fluxul de intrare standard (stdin) și le convertește în funcție de format, apoi le scrie în variabilele specificate. Format - înseamnă că datele sunt convertite într-un anumit formular la primire. Astfel, funcția scanf C este descrisă:

scanf(„%format”, &variabilă1[, &variabilă2, […]), unde variabilele sunt transmise ca adrese. Motivul acestui mod de transmitere a variabilelor unei funcții este evident: ca urmare a muncii, returnează o valoare care indică prezența erorilor, decisingura modalitate de a modifica valorile variabilelor este trecerea după adresă. De asemenea, datorită acestei metode, funcția poate procesa date de orice tip.

Unii programatori se referă la funcții precum scanf() sau printf() ca proceduri din cauza analogiei cu alte limbi.

Scanf permite introducerea tuturor tipurilor de limbaj de bază: char, int, float, șir etc. În cazul variabilelor de tip șir, nu este nevoie să specificați semnul adresei - „&”, deoarece variabila de tip șir este o matrice, iar numele acesteia este adresa primului element al matricei din memoria computerului..

Folosind C în C++
Folosind C în C++

Format de introducere a datelor sau șir de control

Începe prin a te uita la exemplul funcției scanf C din descriere.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); întoarce 0; //cerință pentru sistemele Linux }

Formatul de intrare constă din următorii patru parametri: %[width][modifiers] type. În acest caz, semnul „%” și tipul sunt parametri obligatorii. Adică, formatul minim arată astfel: „%s”, „%d” și așa mai departe.

În general, caracterele care alcătuiesc șirul de format sunt împărțite în:

  • specificatori de format - orice care începe cu %;
  • caractere de separare sau de spațiu - acestea sunt spațiu, tabulator(t), linie nouă (n);
  • caractere, altele decât spații albe.

Funcțiapoate să nu fie sigură.

Folosiți scanf_s() în loc de scanf().

(mesaj de la Visual Studio)

Specificatori de tip sau format, sau caractere de conversie sau caractere de control

cod binar
cod binar

O declarație scanf C trebuie să conțină cel puțin un specificator de format, care este specificat la sfârșitul expresiilor care încep cu „%”. Spune programului tipul de date la care se așteaptă la introducere, de obicei de la tastatură. Lista tuturor specificatorilor de format din tabelul de mai jos.

Tip Semnificat
1 %c Programul așteaptă introducerea unui caracter. Variabila care trebuie scrisă trebuie să fie de tipul caracterului char.
2 %d

Programul așteaptă introducerea unui număr zecimal de tip întreg. Variabila trebuie să fie de tip int.

3 %i Programul așteaptă introducerea unui număr zecimal de tip întreg. Variabila trebuie să fie de tip int.
4 %e, %E Programul se așteaptă să introducă un număr cu virgulă mobilă (virgulă) în formă exponențială. Variabila trebuie să fie de tip float.
5 %f Programul așteaptă un număr în virgulă mobilă (virgulă). Variabila trebuie să fie de tip float.
6 %g, %G Programul așteaptă un număr în virgulă mobilă (virgulă). Variabila trebuie să fie de tip float.
7 %a Programul așteaptă un număr în virgulă mobilă (virgulă). Variabila trebuie să fie de tip float.
8 %o Programul așteaptă un număr octal. Variabila trebuie să fie de tip int.
9 %s Programul așteaptă să fie introdus un șir. Un șir este un set de orice caractere până la primul caracter separator întâlnit. Variabila trebuie să fie de tip șir.
10 %x, %X Programul așteaptă un număr hexazecimal. Variabila trebuie să fie de tip int.
11 %p Variabila așteaptă introducerea indicatorului. Variabila trebuie să fie de tip pointer.
12 %n Scrie într-o variabilă o valoare întreagă egală cu numărul de caractere citite până acum de funcția scanf.
13 %u Programul citește un întreg fără semn. Tipul variabilei trebuie să fie întreg fără semn.
14 %b

Programul așteaptă un număr binar. Variabila trebuie să fie de tip int.

15 % Set de caractere scanat. Programul așteaptă introducerea caracterelor.din grupul limitat specificat între paranteze drepte. scanf va funcționa atâta timp cât există caractere din setul specificat în fluxul de intrare.
16 %% Semnați „%”.

Caractere în șirul de format

cod C++
cod C++

Simbol stea ()

Asteriscul () este un indicator care indică faptul că operația de atribuire ar trebui suprimată. Un asterisc este plasat imediat după semnul „%”. De exemplu,


scanf(„%d%c%d”, &x, &y); // ignora caracterul dintre două numere întregi. scanf("%s%d%s", str, str2); //ignorați întregul dintre două șiruri de caractere.

Adică, dacă introduceți linia „45-20” în consolă, programul va face următoarele:

  1. Variabilei „x” i se va atribui valoarea 45.
  2. Variabilei „y” i se va atribui valoarea 20.
  3. Și semnul minus (liniuță) „-” va fi ignorat datorită „%c”.

Lățimea (sau lățimea câmpului)

Acesta este un număr întreg între semnul „%” și specificatorul de format care specifică numărul maxim de caractere de citit în operația de citire curentă.


scanf(„%20s”, str); //citește primele 20 de caractere din fluxul de intrare

Există câteva lucruri importante de reținut:

  1. scanf se va încheia dacă întâlnește un caracter separator, chiar dacă nu a numărat 20 de caractere.
  2. Dacă sunt introduse mai mult de 20 de caractere, numai primele 20 de caractere vor fi scrise în str.

Modificatoritip (sau precizie)

cod splash
cod splash

Aceștia sunt semnalizatoare speciale care modifică tipul de date așteptate pentru intrare. Steagul este specificat în stânga indicatorului de tip:

  • L sau l (L mic) Când se folosește „l” cu specificatorii d, i, o, u, x, indicatorul spune programului că este așteptată intrarea lungă a int. Când utilizați „l” cu specificatorul e sau f, steag-ul îi spune programului că ar trebui să aștepte o valoare dublă. Folosirea lui „L” spune programului că este de așteptat un dublu lung. Utilizarea lui „l” cu specificatorii „c” și „s” spune programului că sunt așteptate caractere de doi octeți precum wchar_t. De exemplu, „%lc”, „%ls”, „%l[asd]”.
  • h este un steag care indică tipul scurt.
  • hh - indică faptul că variabila este un pointer către o valoare cu semn sau caracter nesemnat. Steagul poate fi folosit cu specificatorii d, i, o, u, x, n.
  • ll (două L mici) - indică faptul că variabila este un pointer către o valoare de tip signed long long int sau unsigned long long int. Steagul este folosit cu specificatorii: d, i, o, u, x, n.
  • j - indică faptul că variabila este un pointer către tipul intmax_t sau uintmax_t din fișierul antet stdint.h. Folosit cu specificatorii: d, i, o, u, x, n.
  • z - indică faptul că variabila este un pointer către tipul size_t, a cărui definiție este în stddef.h. Folosit cu specificatorii: d, i, o, u, x, n.
  • t - indică faptul că variabila este un pointer către tipul ptrdiff_t. Definiție peacest tip este în stddef.h. Folosit cu specificatorii: d, i, o, u, x, n.

Mai clar, imaginea cu modificatori poate fi reprezentată ca un tabel. O astfel de descriere a scanf C pentru programatori va fi mai clară.

Specificatori de tip și modificatori
Specificatori de tip și modificatori

Alte personaje

Orice caracter întâlnit în format va fi eliminat. În același timp, trebuie remarcat faptul că prezența spațiilor albe sau a caracterelor separatoare (linie nouă, spațiu, tab) în șirul de control poate duce la un comportament diferit al funcției. Într-o versiune, scanf() va citi fără a salva niciun număr de separatori până când va întâlni un caracter altul decât separatorul, iar în altă versiune, spațiile (doar ele) nu joacă niciun rol și expresia „%d + %d” este echivalent cu „% d+%d”.

Exemplu de cod C++
Exemplu de cod C++

Exemple

Să ne uităm la câteva exemple pentru a vă ajuta să vă gândiți și să înțelegeți mai bine cum funcționează funcția.


scanf(„%3s”, str); //dacă introduceți șirul „1d2s3d1;3” în consolă, doar „1d2” va fi scris în str scanf(„%dminus%d”, &x, &y); //Caracterele minus între două numere vor fi eliminate scanf("%5[0-9]", str); // caracterele vor fi introduse în str până când sunt 5 caractere, iar caracterele sunt numere de la 0 la 9. scanf("%lf", &d); //așteptați dublu intrare scanf("%hd", &x); //numărul așteptat de tip scurt scanf("%hu", &y); //așteptați un număr nesemnat scurt scanf("lx", &z); //numărul așteptat de tip long int

De laExemplele de mai jos arată cum se modifică numărul așteptat folosind diferite simboluri.

scanf C - descriere pentru începători

Această secțiune va fi utilă pentru începători. Adesea trebuie să aveți la îndemână nu atât o descriere completă a scanf C cât și detalii despre cum funcționează funcția.

  • Această funcție este oarecum învechită. Există mai multe implementări diferite în biblioteci de versiuni diferite. De exemplu, funcția îmbunătățită scanf S C, a cărei descriere poate fi găsită pe site-ul web Microsoft.
  • Numărul de specificatori din format trebuie să se potrivească cu numărul de argumente transmise funcției.
  • Elementele fluxului de intrare trebuie separate numai prin caractere separatoare: spațiu, tabulație, rând nou. Virgulă, punct și virgulă, punct etc. - aceste caractere nu sunt separatoare pentru funcția scanf().
  • Dacă scanf întâlnește un caracter separator, introducerea va fi oprită. Dacă există mai multe variabile de citit, scanf va trece la citirea următoarei variabile.
  • Cea mai mică inconsecvență în formatul datelor de intrare duce la rezultate imprevizibile ale programului. Ei bine, dacă programul se termină doar cu o eroare. Dar de multe ori programul continuă să funcționeze și o face greșit.
  • scanf(„%20s …”, …); Dacă fluxul de intrare depășește 20 de caractere, scanf va citi primele 20 de caractere și va anula sau trece la citirea următoarei variabile, dacă este specificată una. În acest caz, următorul apel la scanf va continua să citească fluxul de intrare din punctul în care munca apelului anterior la scanf s-a oprit. Dacă când citești primele 20caractere, este întâlnit un caracter delimitator, scanf va anula sau va continua citirea următoarei variabile, chiar dacă nu a citit 20 de caractere pentru prima variabilă. În acest caz, toate caracterele necitite vor fi atașate la următoarea variabilă.
  • Dacă setul de caractere scanate începe cu un „^”, atunci scanf va citi datele până când va întâlni un caracter delimitator sau un caracter din set. De exemplu, „%[^A-E1-5]” va citi datele din flux până când se întâlnește unul dintre caracterele engleze majuscule de la A la E sau unul dintre numerele de la 1 la 5.
  • Funcția scanf C, așa cum este descrisă, returnează un număr egal cu numărul reușit de scrieri în variabile. Dacă scanf scrie 3 variabile, atunci rezultatul de succes al funcției va returna numărul 3. Dacă scanf nu a putut scrie nicio variabilă, atunci rezultatul va fi 0. Și, în sfârșit, dacă scanf nu a putut începe deloc dintr-un motiv oarecare, rezultatul va fi EOF.
  • Dacă funcția scanf() s-a încheiat incorect. De exemplu, scanf("%d", &x) - era așteptat un număr, dar caracterele au fost primite ca intrare. Următorul apel scanf() va începe în punctul din fluxul de intrare unde s-a încheiat apelul de funcție anterior. Pentru a depăși această problemă, este necesar să scăpați de personajele cu probleme. Acest lucru se poate face, de exemplu, apelând scanf("%s"). Adică, funcția va citi un șir de caractere și îl va arunca. În acest mod dificil, puteți continua să introduceți datele necesare.
  • În unele implementări ale scanf(), „-” nu este permis în setul de caractere scanat.
  • Specificatorul „%c” citește fiecare caracter din flux. Adică citește și caracterul separator. Pentru a sări peste caracterul delimitator și a continua să citiți caracterul dorit, puteți folosi „%1s”.
  • Când folosiți specificatorul „c”, este permisă utilizarea lățimii „%10c”, dar apoi o matrice de elemente de tip char trebuie să fie transmisă ca variabilă funcției scanf.
  • „%[a-z]” înseamnă „toate literele mici ale alfabetului englez”, iar „%[z-a]” înseamnă doar 3 caractere: „z”, „a”, „-”. Cu alte cuvinte, caracterul „-” înseamnă un interval numai dacă este între două caractere care sunt în ordinea corectă. Dacă „-” se află la sfârșitul unei expresii, la început sau în ordinea greșită a caracterelor de fiecare parte a acestora, atunci este doar un caracter cratimă, nu un interval.
cod C++
cod C++

Concluzie

Aceasta încheie descrierea scanf C. Aceasta este o caracteristică utilă pentru lucrul în programe mici și atunci când utilizați metoda de programare procedurală. Cu toate acestea, principalul dezavantaj este numărul de erori imprevizibile care pot apărea la utilizarea scanf. Prin urmare, descrierea scanf C în timpul programării este cel mai bine păstrată în fața ochilor tăi. În proiectele profesionale mari, iostream-urile sunt folosite, datorită faptului că au capacități de nivel superior, sunt mai capabili să prindă și să gestioneze erorile și să lucreze, de asemenea, cu cantități semnificative de informații. De asemenea, trebuie remarcat faptul că descrierea scanf C în limba rusă este disponibilă pe multe surse de rețea, precum și exemple ale acesteiautilizare, din cauza vechimii funcției. Prin urmare, dacă este necesar, puteți găsi întotdeauna răspunsul pe forumurile tematice.

Recomandat: