Printf

printf è una funzione implementata nei linguaggi di programmazione per visualizzare sullo standard output una stringa costruita in base ad un formato specificato. Tale funzione ha origine dal linguaggio C, dove ha un prototipo simile al seguente:

int printf(const char *format, ...)

Il parametro format è una stringa che descrive il formato da seguire nell'output e che utilizza delle sequenze segnaposto, introdotte dal simbolo percentuale ("%"), per specificare la posizione relativa e il tipo dei dati con cui comporre la stringa..

Per esempio, nel linguaggio C

printf("Colore %s, numero1 %d, numero2 %05d, hex %x, float %5.2f.\n",
             "rosso", 123456, 89, 255, 3.14);

stamperà la seguente linea (escluso il carattere di nuova linea, \n):

Colore rosso, numero1 123456, numero2 00089, hex ff, float 3.14.

La funzione printf restituisce il numero di caratteri stampati, o un numero negativo se si è verificato un errore di output.

Anche il Perl ha la funzione printf ma per la conversione usa caratteri differenti. Python ha una funzionalità analoga (l'operatore %). La libreria GLib contiene la funzione g_print, un'implementazione di printf.

I sistemi POSIX dispongono di un programma denominato printf[1], utilizzabile ad esempio negli script di shell; può essere impiegato in sostituzione del comando echo in situazioni in cui quest'ultimo non sia portabile.

Per esempio:

echo -n -e "$FOO\t$BAR'

può essere riscritto in modo portabile come:

printf '%s\t%s' "$FOO" "$BAR"

Anche il linguaggio PHP dispone della funzione printf, uguale a quella del C/C++.
Nel programma MATLAB non è presente printf, ma sono disponibili due sue estensioni: sprintf e fprintf, che accettano la stessa sintassi nella stringa di formato.

Il linguaggio JavaScript, nonostante sia un linguaggio di programmazione di tipologia curly bracket, non dispone di una funzione printf.

Funzioni derivate

Lo Standard C specifica alcune funzioni derivate da printf che permettono di estenderne gli usi:

fprintf

int fprintf(FILE *stream, const char *format, ...)

fprintf permette la scrittura dell'output su file. Questa funzione viene spesso impiegata per scrivere sullo standard error o su file di testo. In realtà può essere utilizzata per scrivere su qualsiasi file o stream aperto con la funzione fopen, anche se l'utilizzo di fprintf per la scrittura di dati binari può risultare problematica o quantomeno scomoda.

sprintf

int sprintf (char *str, const char *format, ...)

sprintf stampa su una stringa (array di char) anziché sullo standard output. Gli utenti devono accertarsi, attraverso il calcolo o lo stack-smashing protection, che la stringa risultante non sia più lunga della memoria allocata per str. Non accertarsi di questo può causare un buffer overflow.

È da notare che in PHP la funzione sprintf non possiede l'argomento str; al contrario, la funzione restituisce la stringa di output formattata.

Il prototipo della funzione in PHP è:

string sprintf (const string format, ...)

Un'alternativa sicura a sprintf

Come alternativa, molti ambienti forniscono la funzione snprintf:

int snprintf(char *str, size_t size, const char *format, ...)

snprintf garantisce di non scrivere più di size bytes in str, in modo da evitare il rischio di un buffer overflow, come nel codice seguente:

#define BUFFER_SIZE 50
char buf[BUFFER_SIZE];
int n;

...

n = snprintf(buf, BUFFER_SIZE, "Your name is %s.\n", username);
if (n < 0 || n >= BUFFER_SIZE)
   /* Handle error */

Se username nell'esempio precedente è più lungo di 50 caratteri, la funzione limiterà la stringa che viene salvata in buf troncando i caratteri finali. Ciò può sembrare indesiderabile, tuttavia preferibile ad avere una vulnerabilità di sicurezza, a cui un buffer overflow può condurre spesso. Inoltre, il codice di ritorno della funzione snprintf indica quanti caratteri la funzione avrebbe scritto sulla stringa con spazio sufficiente. I sistemi possono usare questa informazione per allocare un nuovo buffer (più grande) se hanno bisogno di tutta la stringa non troncata.

snprintf non è parte del largamente implementato standard ANSI C, come la sprintf. Tuttavia, entra a far parte del linguaggio con lo standard C99 e spesso era presente nelle librerie C anche prima di questo standard.

Un'altra alternativa sicura a sprintf è asprintf:

int asprintf(char **ret, const char *format, ...)

asprintf alloca automaticamente memoria sufficiente per contenere la stringa finale. La funzione inizializza *ret con un puntatore alla stringa risultante o con un valore indefinito se si verifica un errore (È da notare che la Glibc è l'unica implementazione che non sempre inizializza *ret a NULL nel caso in cui si verifichi un errore). Il programmatore, nell'usare la asprintf, ha la responsabilità di liberare la memoria allocata dopo l'uso. Sebbene non sia parte di alcuno standard, asprintf è inclusa nelle librerie C di molti sistemi operativi (inclusi OpenBSD, FreeBSD e NetBSD).

vprintf, vfprintf, vsprintf, vsnprintf, and vasprintf

int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
int vasprintf(char **ret, const char *format, va_list ap);

Queste funzioni sono analoghe a quelle precedenti senza la v, tranne che per il fatto di usare delle liste di argomenti variabili. Queste funzioni offrono la possibilità ai programmatori di creare le proprie varianti della printf. Per esempio, un programmatore potrebbe scrivere una funzione

void fatal_error(const char *format, ...)

Che userebbe la macro va_start per avere una variabile va_list dai parametri extra, stampa un messaggio sul dispositivo di errore standard usando vfprintf, dopo la variabile va_list pulisce con la macro va_end, e alla fine esegue i compiti necessari per chiudere il programma liberando la memoria.

Un'altra applicazione comune di queste funzioni è scrivere un printf arbitrario che stampi su un oggetto diverso da un file. Una libreria grafica può fornire funzioni simili a printf con coordinate x e y:

int graphical_printf(int x, int y, const char *format, ...)

Questo salverebbe temporaneamente la stringa su un buffer privato usando vsnprintf o vasprintf.

Segnaposti del formato printf

La formattazione avviene attraverso segnaposti nella stringa di formato. Per esempio, se un programma vuole stampare l'età di una persona, può presentare l'output con il prefisso "la tua età è". Per specificare che vogliamo che l'integer dell'età venga stampato dopo il messaggio possiamo usare la forma:

"la tua eta' e' %d."

la sintassi del segnaposto di formato è "%[flag][larghezza][.precisione][lunghezza]tipo".

tipo può essere:

  • 'd', 'i' : stampa un intero come decimale con segno. '%d' e '%i' sono sinonimi per l'output, ma diversi se usati con scanf() per l'input;
  • 'u' : stampa un intero come decimale senza segno;
  • 'f', 'F' : Stampa un valore reale come un numero con virgola;
  • 'e', 'E' : Stampa un valore reale nella forma esponenziale standard ([-]d.ddd e[+/-]ddd); 'e' usa la 'e' minuscola, 'E' usa la maiuscola;
  • 'g', 'G' : Stampa un valore reale con notazione reale o esponenziale, scegliendo quella più adatta alla sua dimensione. 'g' usa lettere minuscole, 'G' usa lettere maiuscole. Questa notazione è diversa dalla notazione con virgola perché gli zeri superflui alla destra del punto decimale non sono inclusi. Il punto decimale non è incluso nei numeri interi;
  • 'x', 'X' : Stampa un intero senza segno come numero esadecimale. 'x' usa lettere minuscole e 'X' usa maiuscole;
  • 'o' : Stampa un intero senza segno in base ottale;
  • 's' : Stampa una stringa;
  • 'c' : Stampa un carattere;
  • 'p' : Stampa un puntatore a void, in un formato definito dall'implementazione;
  • 'n' : Scrivi il numero di caratteri finora scritti correttamente in un parametro puntatore a intero;
  • '%' : stampa un carattere '%' (non accetta flag, precisione, lunghezza o larghezza).

I flag si possono omettere:

  • '+' : Printf denota sempre il segno '+' o '-' di un numero (il default è omettere il segno per i numeri positivi). Solo per variabili numeriche.
  • '-' : Printf allinea a sinistra l'output di questo segnaposto (il default è a destra).
  • '#' : Forma alternata: con 'g' e 'G', gli zeri finali non sono rimossi; con 'f', 'F', 'e', 'E', 'g', 'G', l'output contiene sempre un punto decimale; con 'o', 'x', e 'X', vengono rispettivamente prefissi uno 0, 0x, o 0Xai numeri diversi da zero.
  • ' ' : Fa inserire a printf spazi sulla sinistra dell'output fino al raggiungimento della larghezza richiesta. Se combinato con '0' (vedi sotto), farà diventare il segno uno spazio per i numeri positivi, ma gli altri caratteri saranno riempiti da zeri.
  • '0' : Fa usare a printf dei caratteri '0' (anziché spazi) a sinistra fino al raggiungimento di una certa larghezza. Per esempio, assumendo i = 3, printf("%2d", i) risulta in " 3", mentre printf("%02d", i) risulta in "03"

La larghezza può essere omessa, o essere:

  • un numero : printf mostra l'output di questo segnaposto con spazi finché è largo almeno numero caratteri.
  • '*' : printf espande l'output finché è largo n caratteri, dove n è un valore intero memorizzato nel prossimo argomento. Per esempio printf("%*d", 5, 10) risulterà in "10" stampato con una larghezza pari a 5.

La precisione può essere omessa, o essere:

  • un numero : Per i tipi numerici non interi (cioè a virgola mobile), la porzione decimale dell'output viene espressa con esattamente numero cifre. Con le stringhe, taglia l'output a numero caratteri.
  • '*' : Come sopra, ma usa un valore intero nell'argomento successivo per determinare il numero di posizioni decimali o la massima lunghezza della stringa. Per esempio, printf("%.*s", 3, "abcdef") risulterà nella stampa di "abc".

La lunghezza può essere omessa, o essere:

  • 'hh' : per i tipi interi, printf si attende un argomento lungo quanto un char;
  • 'h' : per i tipi interi, printf si attende un argomento lungo quanto un intero corto;
  • 'l' : (elle) per i tipi interi, printf si attende un argomento lungo quanto un intero lungo;
  • 'll' : (elle elle) per i tipi interi, printf si attende un argomento lungo quanto un intero lungo-lungo;
  • 'L' : per i tipi a virgola mobile, printf si attende un argomento lungo quanto un doppio lungo;
  • 'z' : per i tipi interi, printf si attende un argomento lungo quanto un intero di tipo size_t;
  • 'j': per i tipi interi, printf si attende un argomento lungo quanto un intero di tipo intmax_t;
  • 't': per i tipi interi, printf si attende un argomento lungo quanto un intero di tipo ptrdiff_t.

Se la sintassi di una specifica di conversione non è valida, il comportamento non è definito. Se ci sono troppo pochi argomenti di funzione dati per fornire i valori per tutte le specifiche di conversione nella stringa di modello, o se gli argomenti non sono dei tipi giusti, i risultati non sono definiti. Gli argomenti in eccesso vengono ignorati. In alcuni casi il comportamento non definito ha portato ad attacchi contro la sicurezza basati sul formato della stringa. Nota che alcuni compilatori, come GCC, controlleranno alla compilazione le stringhe di formato di printf come fossero funzioni, e segnaleranno eventuali problemi.

La maggior parte dei linguaggi non-C hanno una funzione come printf che lavorano usando il codice di formattazione "%s" e convertendo gli oggetti in testo. Il C++ offre un nuovo modo di eseguire printf. Il C++ infatti include la funzione printf in un nuovo meccanismo completamente diverso, che è generalmente preferito.

Linguaggi di programmazione con printf

Note

  1. ^ (EN) printf, in The Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008. URL consultato il 30 marzo 2010.

Voci correlate

Collegamenti esterni

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica

Read other articles:

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Oktober 2022. Kritik sastra baru (New Criticism) adalah teori sastra yang sangat mendominasi kritik sastra di Amerika Serikat antara tahun 1920-1960[1]. Penamaan gerakan ini menurut buku yang ditulis oleh John Crowe Ransom pada tahun 1941, The New Criticism....

 

 

Carex depauperata Klasifikasi ilmiah Kerajaan: Plantae Divisi: Tracheophyta Kelas: Liliopsida Ordo: Poales Famili: Cyperaceae Genus: Carex Spesies: Carex depauperata Nama binomial Carex depauperataCurtis ex Stokes Carex depauperata adalah spesies tumbuhan seperti rumput yang tergolong ke dalam famili Cyperaceae. Spesies ini juga merupakan bagian dari ordo Poales. Spesies Carex depauperata sendiri merupakan bagian dari genus Carex.[1] Nama ilmiah dari spesies ini pertama kali diterbit...

 

 

Amata Coleman Radewagen Amata Catherine Coleman Radewagen[1] /əˈmɑːtə, ˈrædəˌwæɡən/ (lahir 29 Desember 1947), yang lebih dikenal sebagai Aumua Amata /aʊˈmuːə/, adalah seorang politikus Samoa Amerika yang menjadi delegasi saat ini untuk DPR Amerika Serikat dari Samoa Amerika. Sebagai anggota Partai Republik, Radewagen terpilih pada 4 November 2014, setelah mengalahkan petahana Partai Demokrat Eni Faleomavaega. Ia memulai masa jabatannya pada 3 Januari 2015. Referensi ^ ...

Asosiasi Sepak Bola Saint Kitts dan NevisCONCACAFDidirikan1932Kantor pusatBasseterreBergabung dengan FIFA1992Bergabung dengan CONCACAF1990 (anggota rekan)1992PresidenAnthony JohnsonWebsitehttp://www.sknfa.com Asosiasi Sepak Bola Saint Kitts dan Nevis (Inggris: St. Kitts and Nevis Football Associationcode: en is deprecated ) adalah badan pengendali sepak bola di Saint Kitts dan Nevis. Kompetisi Badan ini menyelenggarakan beberapa kompetisi di Saint Kitts dan Nevis, termasuk Liga Utama SKNFA ya...

 

 

1994 World JuniorChampionships in AthleticsTrack events100 mmenwomen200 mmenwomen400 mmenwomen800 mmenwomen1500 mmenwomen3000 mwomen5000 mmen10,000 mmenwomen100 m hurdleswomen110 m hurdlesmen400 m hurdlesmenwomen3000 msteeplechasemen4 × 100 m relaymenwomen4 × 400 m relaymenwomen5000 m walkwomen10,000 m walkmenRoad events20 km walkmenField eventsHigh jumpmenwomenPole vaultmenLong jumpmenwomenTriple jumpmenShot putmenwomenDiscus throwmenwomenHammer throwmenJavelin throwmenwomenCombined event...

 

 

У этого термина существуют и другие значения, см. Синоним (значения). Синонимыивр. מילים נרדפות‎ Жанр драма Режиссёр Надав Лапид Продюсеры Саид Бен Саид, Мишель Мерк, Оснат Хандельсман-Керен, Талия Клянхендлер, Джанин Джаковски, Джонас Дорнбах, Оливье Пер, Кевин Чнейвей�...

العلاقات البرتغالية التشيكية البرتغال التشيك   البرتغال   التشيك تعديل مصدري - تعديل   العلاقات البرتغالية التشيكية هي العلاقات الثنائية التي تجمع بين البرتغال والتشيك.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة عامة ومرجعية للدولتين: وجه ال...

 

 

TMZ

TMZURLwww.tmz.comTipeTabloidPerdagangan ?YaRegistration (en)OpsionalLangueInggrisBagian dariWarner Media Group, Telepictures (en), Warner Bros. dan Fox Corporation PemilikFox Corporation Pembuat Harvey Levin Jim Paratore[1] Publisher (en)Harvey LevinService entry (en)8 November 2005; 18 tahun lalu (2005-11-08)[2]Lokasi kantor pusatJefferson Boulevard (en) dan Los Angeles NegaraAmerika Serikat Peringkat Alexa 1497 (Maret 2020[update])[3]KeadaanAktif TM...

 

 

Wakil Perdana MenteriLambang Pemerintah JepangPetahanaLowongsejak 4 Oktober 2021GelarTuan Wakil Perdana MenteriYang MuliaAnggotaKabinetDewan Keamanan NasionalDitunjuk olehPerdana Menteridibuktikan oleh KaisarMasa jabatanTidak ada istilah tetapPejabat perdanaKijuro ShideharaDibentuk3 Mei 1947SuksesiPertamaGaji¥20,916,000 Wakil Perdana Menteri Jepang (副総理code: ja is deprecated , Fuku-sōri) adalah pejabat tertinggi kedua dari cabang eksekutif pemerintah Jepang setelah Perdana Menter...

Czech cyclist Petra ŠevčíkováŠevčíková in 2019Personal informationBorn (2000-09-01) 1 September 2000 (age 23)Team informationRoleRider Petra Ševčíková (born 1 September 2000) is a Czech racing cyclist.[1][2] In November 2020, she competed in the women's team sprint event at the 2020 UEC European Track Championships in Plovdiv, Bulgaria.[3] References ^ Petra Ševčíková. ProCyclingStats. Retrieved 11 November 2020. ^ Petra Ševčíková, velký talen...

 

 

Carte des Communautés de BelgiqueCommunauté flamande (en vert)Communauté française(en rouge)Région de Bruxelles-Capitale (où les 2 communautés ont des compétences, striée vert et rouge)Communauté germanophone (en bleu) Les communautés de Belgique sont des collectivités politiques fédérées autonomes, compétentes en matière d'enseignement, de culture, de politique de santé, d'aide aux personnes et d'emploi des langues[1]. Elles sont créées lors de la première réforme de l'...

 

 

4733d Air Defense Group Map of the DEW LineActive1957–1958Country United StatesBranch United States Air ForceTypeAircraft Warning and ControlRoleAir DefensePart ofAir Defense CommandMilitary unit The 4733d Air Defense Group is a discontinued United States Air Force organization. Its last assignment was with the 64th Air Division at Frobisher Bay, Baffin Island, Northwest Territories, Canada, where it was discontinued in 1958. The group was formed in 1957 when ADC assumed res...

Pour les articles homonymes, voir Mohammed Ali. Méhémet Ali Portrait de Méhémet Ali par Louis-Charles-Auguste Couder (1840). Titre Wali d'Égypte, Soudan, Syrie, Hedjaz, Morée, Thasos et Crète 17 mai 1805 – 2 mars 1848(42 ans, 9 mois et 14 jours) Prédécesseur Khursit Pacha (gouverneur) Successeur Ibrahim Pacha Biographie Dynastie Dynastie de Méhémet Ali Date de naissance Fin des années 1760 Lieu de naissance Kavala, Macédoine orientale Date de décès 2 août 184...

 

 

Type of Brazilian restaurant Not to be confused with Chiaroscuro. This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Churrascaria – news · newspapers · books · scholar · JSTOR (September 2014) (Learn how and when to remove this message) Churrasco barbecue cooking on a churrasqueira grill A churrascaria (Portugu...

 

 

هيبارين منخفض الوزن الجزيئي نادروبارين في حقنة مملوءة مسبقًا اعتبارات علاجية معرّفات بيانات كيميائية تعديل مصدري - تعديل   يُعتبر الهيبارين منخفض الوزن الجزيئي إحدى فئات الأدوية المضادة للتخثُّر.[1] تُستحدم هذه الأدوية في الوقاية من الخثرات الدموية، في علاج الا�...

Commune and town in Constantine Province, AlgeriaIbn ZiadCommune and townCountry AlgeriaProvinceConstantine ProvincePopulation (1998) • Total15,514Time zoneUTC+1 (CET) Ibn Ziad is a town and commune in Constantine Province, Algeria. According to the 1998 census it has a population of 15,514.[1] References Algeria portal ^ Statoids vte Constantine ProvinceConstantine District Constantine Aïn Abid District Aïn Abid Ben Badis El Khroub District El Khroub Aïn Smar...

 

 

COX-2 selective NSAID medication EtoricoxibClinical dataAHFS/Drugs.comInternational Drug NamesPregnancycategory AU: C Not recommended Routes ofadministrationBy mouthATC codeM01AH05 (WHO) Legal statusLegal status AU: S4 (Prescription only)[1] BR: Class C1 (Other controlled substances)[2] UK: POM (Prescription only) Pharmacokinetic dataBioavailability100%Protein binding92%MetabolismLiver, CYP extensively involved (mainly CYP3A4)Elimination half-life...

 

 

حكومة نادر الذهبيمعلومات عامةرئيس الحكومة نادر الذهبيالتكوين 25 نوفمبر 2007النهاية 09 ديسمبر 2009المدة سنتان و14 يومًاحكومة معروف البخيت الأولىحكومة سمير زيد الرفاعي الأولىتعديل - تعديل مصدري - تعديل ويكي بياناتجزء من سلسلة مقالات سياسة الأردنالأردن الدستور الدستور حقوق ال...

The Open University (OU) UbicazioneStato Regno Unito CittàMilton Keynes Dati generaliMotto'Learn and Live' Fondazione1969 FondatoreHarold Wilson Tipouniversità statale RettoreBaronessa Lane-Fox of Soho Studenti168 215 Dipendenti11 472 AffiliazioniUniversity Alliance Mappa di localizzazione Sito web e Sito web Modifica dati su Wikidata · Manuale La Open University (OU) è un'università pubblica di ricerca specializzata nell'insegnamento a distanza, e una delle più gran...

 

 

Alubia seca Painted Pony (Phaseolus vulgaris') Planta de frijoles Un frijol (también fríjol),[1]​ habichuela,[2]​ judía,[3]​ poroto,[4]​ frejol (también fréjol),[5]​ frisol[6]​ (también frísol)[7]​ o xpelón,[8]​ es la semilla de uno de los varios géneros de las plantas con flor de la familia Fabaceae, que se utilizan como hortalizas para la alimentación humana o animal.[9]​ Se pueden cocinar de muchas maneras diferentes,[10]̴...