Printf

De la Viquipèdia, l'enciclopèdia lliure
Un exemple de la funció printf

La família de funcions printf en el llenguatge de programació C és un conjunt de funcions que prenen una cadena de format com a entrada entre una llista de mida variable d'altres valors i produeixen com a sortida una cadena que es correspon amb l'especificador de format i els valors d'entrada donats. La cadena s'escriu en un llenguatge de plantilla senzill: els caràcters normalment es copien literalment a la sortida de la funció, però els especificadors de format, que comencen amb un caràcter %, indiquen la ubicació i el mètode per traduir una dada (com ara un número) a caràcters. El disseny s'ha copiat per exposar una funcionalitat similar en altres llenguatges de programació.[1]

"printf" és el nom d'una de les principals funcions de sortida de C, i significa " print f ormatted". Les cadenes de format printf són complementàries de les cadenes de format scanf, que proporcionen entrada amb format (lexing, també conegut com a anàlisi). En ambdós casos, aquests proporcionen una funcionalitat senzilla i un format fix en comparació amb els motors de plantilles més sofisticats i flexibles o els lectors/analitzadors, però són suficients per a molts propòsits.[2]

Molts idiomes que no siguin C copien la sintaxi de la cadena de format printf de prop o exactament en les seves pròpies funcions d'E/S.

Les discrepàncies entre els especificadors de format i el tipus de dades poden provocar bloquejos i altres vulnerabilitats. La cadena de format en si és molt sovint una cadena literal, que permet l'anàlisi estàtica de la trucada de funció. Tanmateix, també pot ser el valor d'una variable, que permet un format dinàmic, però també una vulnerabilitat de seguretat coneguda com a explotació de cadena de format no controlada.[3]

Història[modifica]

Els primers llenguatges de programació com Fortran utilitzaven declaracions especials amb una sintaxi completament diferent d'altres càlculs per crear descripcions de format. En aquest exemple, el format s'especifica a la línia 601 i l'ordre WRITE s'hi fa referència pel número de línia:

      WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA
 601  FORMAT (4H A= ,I5,5H  B= ,I5,5H  C= ,I5,
     &        8H  AREA= ,F10.2, 13H SQUARE UNITS)

Però l'ús de les trucades a funcions normals i els tipus de dades simplifica el llenguatge i el compilador, i permet que la implementació de l'entrada/sortida s'escrigui en el mateix llenguatge. Aquests avantatges superen els desavantatges (com ara la manca total de seguretat de tipus en molts casos) i en la majoria dels idiomes més nous l'E/S no forma part de la sintaxi. ALGOL 68 tenia més API semblant a una funció, però encara utilitzava una sintaxi especial (els delimitadors $ envolten una sintaxi de format especial):

printf(($"Color "g", number1 "6d,", number2 "4zd,", hex "16r2d,", float "-d.2d,", unsigned value"-3d"."l$,
         "red", 123456, 89, BIN 255, 3.14, 250));

printf de C té els seus orígens en la funció writef de BCPL (1966). En comparació amb C i printf, *N és una seqüència d'escapada del llenguatge BCPL que representa un caràcter de nova línia (per al qual C utilitza la seqüència d'escapament \n ) i l'ordre de l'amplada i el tipus de camp de l'especificació de format s'inverteix a writef: [4]

Especificació del marcador de posició de format[modifica]

El format es realitza mitjançant marcadors de posició dins de la cadena de format. Per exemple, si un programa vol imprimir l'edat d'una persona, podria presentar la sortida prefixant-la amb "La teva edat és" i utilitzant el caràcter d'especificador decimal amb signe d per indicar que volem que es mostri l'enter de l'edat. immediatament després d'aquest missatge, podem utilitzar la cadena de format:

printf("Your age is %d", age);

La sintaxi d'un marcador de posició de format és

%[parameter][flags][width][.precision][length]type

Referències[modifica]

  1. «[https://cplusplus.com/reference/cstdio/printf/ function printf]» (en anglès). [Consulta: 14 desembre 2023].
  2. «Difference between fprintf, printf and sprintf?» (en anglès). [Consulta: 14 desembre 2023].
  3. «A `printf` format reference page (cheat sheet) (C, Java, Scala, etc.) | alvinalexander.com» (en anglès). [Consulta: 14 desembre 2023].
  4. «BCPL» (en anglès). cl.cam.ac.uk. [Consulta: 19 març 2018].