Scanf

De la Viquipèdia, l'enciclopèdia lliure

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]

Història[modifica]

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.

Ús[modifica]

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;
}

Especificacions de la cadena de format[modifica]

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.
  • espai en blanc: qualsevol caràcter d'espai en blanc desencadena una exploració de zero o més caràcters d'espai en blanc. El nombre i el tipus de caràcters d'espai en blanc no cal que coincideixin en cap de les direccions.
  • %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ó.

Referències[modifica]

  1. «How to Use scanf( ) in C to Read and Store User Input» (en anglès), 06-03-2023. [Consulta: 14 desembre 2023].
  2. «scanf in C» (en anglès americà), 24-06-2022. [Consulta: 14 desembre 2023].
  3. «C Input/Output: printf() and scanf()» (en anglès). [Consulta: 14 desembre 2023].
  4. «The Basics of C Programming» (en anglès americà), 01-04-2000. [Consulta: 14 desembre 2023].