Descripció de la funció Scanf C
Descripció de la funció Scanf C

Vídeo: Descripció de la funció Scanf C

Vídeo: Descripció de la funció Scanf C
Vídeo: Locked Military Trunks from Abandoned Storage Wars Auction JACKPOT 2024, Maig
Anonim

En aquest article, la funció scanf() es considera de forma general sense referència a un estàndard específic, de manera que s'inclouen aquí les dades de qualsevol estàndard C99, C11, C++11, C++14. Potser, en alguns estàndards, la funció funciona amb diferències amb el material presentat a l'article.

Funció C scanf - descripció

scanf() és una funció ubicada als fitxers de capçalera stdio.h(C) i cstdio(C++), també conegut com a entrada de programa amb format. scanf llegeix caràcters del flux d'entrada estàndard (stdin) i els converteix segons el format, i després els escriu a les variables especificades. Format: significa que les dades es converteixen a un formulari determinat quan es reben. Així, es descriu la funció scanf C:

scanf("%format", &variable1[, &variable2, […]), on les variables es passen com a adreces. El motiu d'aquesta manera de passar variables a una funció és evident: com a resultat del treball, retorna un valor que indica la presència d'errors, de manera quel'única manera de canviar els valors de les variables és passant per adreça. A més, gràcies a aquest mètode, la funció pot processar dades de qualsevol tipus.

Alguns programadors es refereixen a funcions com scanf() o printf() com a procediments a causa de l'analogia amb altres llenguatges.

Scanf permet l'entrada de tots els tipus de llenguatge bàsic: char, int, float, string, etc. En el cas de variables de tipus string, no cal especificar el signe d'adreça - "&", ja que la variable de tipus string és una matriu i el seu nom és l'adreça del primer element de la matriu a la memòria de l'ordinador..

Ús de C en C++
Ús de C en C++

Format d'entrada de dades o cadena de control

Comenceu mirant l'exemple de la funció scanf C de la descripció.


include int main() { int x; mentre que (scanf("%d", &x)==1) printf("%d\n", x); retorn 0; //requisit per als sistemes Linux }

El format d'entrada consta dels quatre paràmetres següents: tipus %[amplada][modificadors]. En aquest cas, el signe "%" i el tipus són paràmetres obligatoris. És a dir, el format mínim té aquest aspecte: “%s”, “%d” i així successivament.

En general, els caràcters que formen la cadena de format es divideixen en:

  • especificadors de format: qualsevol cosa que comenci per %;
  • caràcters de separació o espai: són espai, tabulació(t), nova línia (n);
  • caràcters que no siguin espais en blanc.

És possible que la funcióno sigui segura.

Feu servir scanf_s() en lloc de scanf().

(missatge de Visual Studio)

Especificadors de tipus o format, o caràcters de conversió o caràcters de control

codi binari
codi binari

Una declaració scanf C ha de contenir almenys un especificador de format, que s'especifica al final de les expressions que comencen per "%". Indica al programa el tipus de dades que s'espera en introduir, normalment des del teclat. Llista de tots els especificadors de format a la taula següent.

Tipus

Significat
1 %c El programa està esperant una entrada de caràcters. La variable que s'ha d'escriure ha de ser del tipus de caràcter char.
2 %d El programa espera l'entrada d'un nombre decimal de tipus enter. La variable ha de ser del tipus int.
3 %i El programa espera l'entrada d'un nombre decimal de tipus enter. La variable ha de ser del tipus int.
4 %e, %E El programa espera introduir un nombre de coma flotant (coma) en forma exponencial. La variable ha de ser del tipus float.
5 %f El programa espera un nombre de coma flotant (coma). La variable ha de ser del tipus float.
6 %g, %G El programa espera un nombre de coma flotant (coma). La variable ha de ser del tipus float.
7 %a El programa espera un nombre de coma flotant (coma). La variable ha de ser del tipus float.
8 %o El programa espera un nombre octal. La variable ha de ser del tipus int.
9 %s El programa està esperant que s'introdueixi una cadena. Una cadena és un conjunt de caràcters fins al primer caràcter separador trobat. La variable ha de ser de tipus string.
10 %x, %X El programa està esperant un número hexadecimal. La variable ha de ser del tipus int.
11 %p La variable espera l'entrada del punter. La variable ha de ser de tipus punter.
12

%n

Escriu en una variable un valor enter igual al nombre de caràcters llegits fins ara per la funció scanf.
13 %u El programa llegeix un nombre enter sense signe. El tipus de variable ha de ser un enter sense signe.
14 %b El programa està esperant un número binari. La variable ha de ser del tipus int.
15 % Conjunt de caràcters escanejat. El programa està esperant que s'introdueixin caràcters.del grup limitat especificat entre claudàtors. scanf funcionarà sempre que hi hagi caràcters del conjunt especificat al flux d'entrada.
16 %% Sign "%".

Caràcters a la cadena de format

codi C++
codi C++

Símbol d'estrella ()

L'asterisc () és una bandera que indica que l'operació d'assignació s'ha de suprimir. Un asterisc es col·loca immediatament després del signe "%". Per exemple,


scanf("%d%c%d", &x, &y); //ignora el caràcter entre dos nombres enters. scanf("%s%d%s", str, str2); //ignora el nombre enter entre dues cadenes.

É a dir, si introduïu la línia "45-20" a la consola, el programa farà el següent:

  1. A la variable "x" s'assignarà el valor 45.
  2. A la variable "y" s'assignarà el valor 20.
  3. I el signe menys (guionet) "-" s'ignorarà gràcies a "%c".

Amplada (o amplada del camp)

Aquest és un nombre enter entre el signe "%" i l'especificador de format que especifica el nombre màxim de caràcters a llegir en l'operació de lectura actual.


scanf("%20s", str); //llegiu els primers 20 caràcters del flux d'entrada

Hi ha algunes coses importants a tenir en compte:

  1. scanf finalitzarà si troba un caràcter separador, encara que no compti 20 caràcters.
  2. Si s'introdueixen més de 20 caràcters, només s'escriuran els primers 20 caràcters a str.

Modificadorstipus (o precisió)

codi splash
codi splash

Aquests són indicadors especials que modifiquen el tipus de dades que s'esperen per introduir. La bandera s'especifica a l'esquerra de l'especificador de tipus:

  • L o l (L petita) Quan s'utilitza "l" amb els especificadors d, i, o, u, x, el senyalador indica al programa que s'espera una entrada llarga int. Quan s'utilitza "l" amb l'especificador e o f, el senyalador indica al programa que hauria d'esperar un valor doble. L'ús de "L" indica al programa que s'espera un doble llarg. L'ús de "l" amb els especificadors "c" i "s" indica al programa que s'esperen caràcters de dos bytes com wchar_t. Per exemple, "%lc", "%ls", "%l[asd]".
  • h és una bandera que indica el tipus curt.
  • hh - indica que la variable és un punter a un valor de caràcters amb signe o sense signe. La bandera es pot utilitzar amb els especificadors d, i, o, u, x, n.
  • ll (dues L petites) - indica que la variable és un punter a un valor de tipus signed long long int o unsigned long long int. La bandera s'utilitza amb especificadors: d, i, o, u, x, n.
  • j - indica que la variable és un punter al tipus intmax_t o uintmax_t del fitxer de capçalera stdint.h. S'utilitza amb especificadors: d, i, o, u, x, n.
  • z - indica que la variable és un punter al tipus size_t, la definició del qual es troba a stddef.h. S'utilitza amb especificadors: d, i, o, u, x, n.
  • t - indica que la variable és un punter al tipus ptrdiff_t. Definició sobreaquest tipus es troba a stddef.h. S'utilitza amb especificadors: d, i, o, u, x, n.

Més clarament, la imatge amb modificadors es pot representar com una taula. Aquesta descripció de scanf C per a programadors serà més clara.

Especificadors i modificadors de tipus
Especificadors i modificadors de tipus

Altres personatges

Qualsevol caràcter que es trobi al format es descartarà. Al mateix temps, cal tenir en compte que la presència d'espais en blanc o caràcters separadors (nova línia, espai, tabulació) a la cadena de control pot provocar un comportament diferent de la funció. En una versió, scanf() llegirà sense desar cap nombre de separadors fins que trobi un caràcter que no sigui el separador, i en una altra versió, els espais (només ells) no tenen cap paper i l'expressió "%d + %d" és equivalent a "% d+%d".

Exemple de codi C++
Exemple de codi C++

Exemples

Mirem alguns exemples per ajudar-vos a pensar i entendre millor com funciona la funció.


scanf("%3s", str); //si introduïu la cadena "1d2s3d1;3" a la consola, només s'escriurà "1d2" a str scanf("%dminus%d", &x, &y); //Els caràcters menys entre dos números es descartaran scanf("%5[0-9]", str); // els caràcters s'introduiran a str fins que hi hagi 5 caràcters i els caràcters siguin números del 0 al 9. scanf("%lf", &d); //espera una doble entrada scanf("%hd", &x); //nombre esperat de tipus short scanf("%hu", &y); //espera un número sense signar curt scanf("lx", &z); //número esperat de tipus long int

DeEls exemples següents mostren com canvia el nombre esperat amb diferents símbols.

scanf C - descripció per a principiants

Aquesta secció serà útil per als principiants. Sovint cal tenir a mà no tant una descripció completa de scanf C com els detalls de com funciona la funció.

  • Aquesta funció està una mica obsoleta. Hi ha diverses implementacions diferents en biblioteques de diferents versions. Per exemple, la funció scanf SC millorada, una descripció de la qual es pot trobar al lloc web de Microsoft.
  • El nombre d'especificadors del format ha de coincidir amb el nombre d'arguments passats a la funció.
  • Els elements del flux d'entrada només s'han de separar per caràcters separadors: espai, tabulació, línia nova. Coma, punt i coma, punt, etc.: aquests caràcters no són separadors per a la funció scanf().
  • Si scanf troba un caràcter separador, l'entrada s'aturarà. Si hi ha més d'una variable per llegir, scanf passarà a llegir la variable següent.
  • La més mínima inconsistència en el format de les dades d'entrada provoca resultats impredictibles del programa. Bé, si el programa acaba amb un error. Però sovint el programa continua funcionant i ho fa malament.
  • scanf("%20s …", …); Si el flux d'entrada supera els 20 caràcters, scanf llegirà els primers 20 caràcters i avortarà o passarà a llegir la següent variable, si s'especifica una. En aquest cas, la següent trucada a scanf continuarà llegint el flux d'entrada des del punt on es va aturar el treball de la trucada anterior a scanf. Si en llegir els 20 primerscaràcters, es troba un caràcter delimitador, scanf avortarà o continuarà llegint la següent variable, encara que no hagi llegit 20 caràcters per a la primera variable. En aquest cas, tots els caràcters no llegits s'adjuntaran a la variable següent.
  • Si el conjunt de caràcters escanejats comença amb un "^", llavors scanf llegirà les dades fins que trobi un caràcter delimitador o un caràcter del conjunt. Per exemple, "%[^A-E1-5]" llegirà les dades del flux fins que es trobi un dels caràcters anglesos majúscules de la A a la E o un dels números de l'1 al 5.
  • La funció scanf C, tal com es descriu, retorna un nombre igual al nombre correcte d'escriptures a les variables. Si scanf escriu 3 variables, aleshores el resultat d'èxit de la funció retornarà el número 3. Si scanf no ha pogut escriure cap variable, aleshores el resultat serà 0. I, finalment, si scanf no ha pogut iniciar-se en absolut per algun motiu, el el resultat serà EOF.
  • Si la funció scanf() ha acabat incorrectament. Per exemple, scanf("%d", &x): s'esperava un número, però es van rebre caràcters com a entrada. La següent crida a scanf() començarà en el punt del flux d'entrada on va acabar la crida de funció anterior. Per superar aquest problema, cal desfer-se dels personatges problemàtics. Això es pot fer, per exemple, cridant a scanf("%s"). És a dir, la funció llegirà una cadena de caràcters i la llençarà. D'aquesta manera complicada, podeu continuar introduint les dades necessàries.
  • En algunes implementacions de scanf(), "-" no es permet al conjunt de caràcters escanejat.
  • L'especificador "%c" llegeix cada caràcter del flux. És a dir, també llegeix el caràcter separador. Per ometre el caràcter delimitador i continuar llegint el caràcter desitjat, podeu utilitzar "%1s".
  • Quan s'utilitza l'especificador "c", és permès utilitzar l'amplada "%10c", però llavors s'ha de passar una matriu d'elements de tipus char com a variable a la funció scanf.
  • “%[a-z]” significa “totes les lletres minúscules de l'alfabet anglès” i “%[z-a]” només significa 3 caràcters: ‘z’, ‘a’, ‘-’. En altres paraules, el caràcter "-" significa un interval només si es troba entre dos caràcters que estan en l'ordre correcte. Si "-" es troba al final d'una expressió, al principi o en l'ordre incorrecte dels caràcters a banda i banda d'elles, és només un caràcter de guionet, no un rang.
codi C++
codi C++

Conclusió

Això conclou la descripció de scanf C. Aquesta és una característica molt útil per treballar en programes petits i quan s'utilitza el mètode de programació procedimental. Tanmateix, el principal desavantatge és el nombre d'errors impredictibles que es poden produir quan s'utilitza scanf. Per tant, la descripció de scanf C quan es programa es manté millor davant dels vostres ulls. En grans projectes professionals, s'utilitzen iostreams, a causa del fet que tenen capacitats de nivell superior, són més capaços de detectar i gestionar errors, i també de treballar amb quantitats importants d'informació. També cal tenir en compte que la descripció de scanf C en rus està disponible a moltes fonts de xarxa, així com exemples d'aixòús, a causa de l'antiguitat de la funció. Per tant, si cal, sempre pots trobar la resposta als fòrums temàtics.

Recomanat: