Una cadena de format scanf (scan f ormatted) és un paràmetre de control utilitzat en diverses funcions per especificar la disposició d'una cadena d'entrada. Aleshores, les funcions poden dividir la cadena i traduir-la en valors dels tipus de dades adequats. Les funcions d'exploració de cadenes sovint s'ofereixen a les biblioteques estàndard. Scanf és una funció que llegeix dades amb format de la cadena d'entrada estàndard, que sol ser el teclat i escriu els resultats sempre que es crida als arguments especificats.[1]
El terme "scanf" prové de la biblioteca C, que va popularitzar aquest tipus de funcions, però aquestes funcions són anteriors a C, i s'utilitzen altres noms, com ara readf
a ALGOL 68. Les cadenes de format scanf, que proporcionen entrada formatada (anàlisi), són complementàries de les cadenes de format printf, que proporcionen una sortida formatada (templating). Aquests proporcionen una funcionalitat senzilla i un format fix en comparació amb analitzadors o motors de plantilles més sofisticats i flexibles, però són suficients per a molts propòsits.[2]
La biblioteca portàtil d'entrada/sortida de Mike Lesk, inclòs scanf
, va passar oficialment a formar part d'Unix a la versió 7.
La funció scanf
, que es troba a C, llegeix l'entrada per a números i altres tipus de dades d'entrada estàndard (sovint una interfície de línia d'ordres o un tipus similar d'interfície d'usuari de text).[3]
El codi C següent llegeix un nombre variable d'enters decimals sense format del flux d'entrada estàndard i imprimeix cadascun d'ells en línies separades:
#include <stdio.h>
int main(void)
{
int n;
while (scanf("%d", &n) == 1)
printf("%d\n", n);
return 0;
}
Els marcadors de posició de format a scanf
són més o menys els mateixos que a printf
, la seva funció inversa. Com a printf, es defineix l'extensió POSIX n$
.
Poques vegades hi ha constants (és a dir, caràcters que no formen marcadors de posició) en una cadena de format, principalment perquè un programa normalment no està dissenyat per llegir dades conegudes, tot i que scanf
les accepta si s'especifica explícitament. L'excepció és un o més espais en blanc, que descarten tots els espais en blanc de l'entrada.[4]
Alguns dels marcadors de posició més utilitzats són els següents:
%a
: escaneja un nombre de coma flotant en la seva notació hexadecimal.%d
: escaneja un nombre enter com a nombre decimal amb signe.%i
: escaneja un nombre enter com a nombre signat. Similar a %d
, però interpreta el nombre com a hexadecimal quan està precedit de 0x
i octal quan està precedit de 0
. Per exemple, la cadena 031
es llegiria com a 31 amb %d
i 25 amb %i
. El senyalador h
a %hi
indica la conversió a una conversió short
i la conversió hh
a un char
.%u
: Busqueu unsigned int
(tingueu en compte que a l'estàndard C99 el valor d'entrada del signe menys és opcional, de manera que si es llegeix un signe menys, no hi haurà errors i el resultat serà el complement de dos d'un nombre negatiu, probablement molt gran). valor. Veure strtoul ()
. En conseqüència, %hu
cerca un unsigned short
i %hhu
cerca un unsigned char
.%f
: escaneja un nombre de coma flotant en notació normal (de punt fix).%G
%g
: escaneja un nombre de coma flotant en notació normal o exponencial. %g
utilitza lletres minúscules i %G
utilitza majúscules.%x
, %X
: escaneja un nombre enter com a nombre hexadecimal sense signe.%o
: escaneja un nombre enter com a nombre octal.%s
: escaneja una cadena de caràcters. L'exploració acaba a l'espai en blanc. S'emmagatzema un caràcter nul al final de la cadena, la qual cosa significa que la memòria intermèdia subministrada ha de ser almenys un caràcter més llarg que la longitud d'entrada especificada.%c
: escaneja un caràcter (car). No s'afegeix cap caràcter nul.%lf
: escaneja com a nombre doble de coma flotant. Format "Float" amb l'especificador "long".%Lf
: escaneja com a nombre llarg de coma flotant doble. Format "Float" a l'especificador "long long".%n
: No s'espera res. El nombre de caràcters consumits fins ara des de l'entrada s'emmagatzema a través del punter següent, que ha de ser un punter a int. Això no és una conversió i no augmenta el recompte que retorna la funció.