Tuesday, October 11, 2016

Linux Printf Formaat Binary Options

Die printf opdrag vreemdeling, dit is 'n baie groot onderwerp wat ondervinding nodig - vul die ontbrekende inligting, brei die beskrywings, en korrek is die besonderhede as wat jy kan Aandag: Dit gaan oor die Bash-ingeboude command printf - maar die beskrywing moet wees byna identies vir 'n eksterne opdrag dat POSIX volg. GNU AWK verwag 'n komma na die formaat string en tussen elkeen van die argumente van 'n printf opdrag. Vir voorbeelde, sien: kode uit. In teenstelling met ander dokumentasie, don039t Ek wil jou lei na die hand bladsy vir die printf () C-funksie familie. Maar as you039re meer ervare, wat moet die mees gedetailleerde beskrywing vir die formaat snare en wysigers wees. As gevolg van botsende historiese implementering van die eggo opdrag, POSIX beveel aan dat printf word verkies bo eggo. Algemene Die printf opdrag bied 'n metode om vooraf opgemaakte teks soortgelyk aan die printf () stelsel interface (C-funksie) te druk. It039s bedoel as opvolger vir eggo en het baie meer funksies en moontlikhede. Behalwe ander redes, POSIX het 'n baie goeie argument om dit aan te beveel: Beide historiese hoof geure van die eggo opdrag is wedersydse eksklusiewe, hulle bots. A quotnewquot opdrag moes uitgevind om die probleem op te los. Sintaksis Die teks formaat gegee in ltFORMATgt. terwyl al die argumente van die formatstring kan wys word daarna hier, soos aangedui deur ltARGUMENTSgt. Dus, 'n tipiese printf sonder dat doping lyk: waar quotSurname: snName: snquot is die formaat spesifikasie, en die twee veranderlikes asof argumente, die s in die formatstring punte om (vir elke formaat specific jy gee, printf wag een argument) . Opsies As gegee, die uitset aan die veranderlike VAR in plaas van gedrukte om stdout (vergelykbaar met sprintf () in een of ander manier) Die v Opsie can039t direk toewys aan verskeidenheid indekse in bash weergawes ouer as Bash 4.1. In weergawes nuwer as 4.1, moet 'n mens versigtig wees wanneer die uitvoering van uitbreidings in die eerste nie-opsie argument van printf aangesien dit open die moontlikheid van 'n maklike kwesbaarheid kode inspuiting. waar die eggo kan natuurlik vervang met enige arbitrêre opdrag. As jy moet, óf spesifiseer 'n harde-gekodeerde formaat string of gebruik - tot aan die einde van opsies sein. Presies dieselfde probleem geld ook vir lees. en 'n soortgelyke een te mapfile. alhoewel die uitvoering van uitbreidings in hul argumente is minder algemeen. Argumente Natuurlik in die dop-wat beteken dat die argumente is net snare, maar die algemene C-notasies plus 'n paar toevoegings vir nommer-konstantes word erken tot 'n aantal-argument om printf. Run 'n opdrag en Return Tyd Statistiek gee behulp Die tyd bevel Opdateer Junie 16, 2016 Inleiding die tyd bevel is een van die minder bekende Linux instruksies, maar dit kan gebruik word om gewys hoe lank 'n opdrag neem om uit te voer. Dit is nuttig as jy 'n ontwikkelaar en jy wil om die prestasie van jou program of script toets. Hierdie gids sal 'n lys van die belangrikste skakel wat jy sal gebruik met die tyd bevel saam met hulle betekenisse. Hoe om te gebruik Die Tyd Gee bevel aan die sintaksis van die tyd bevel is soos volg: Lees verder Onder tyd ltcommandgt ltcommand switchesgt Byvoorbeeld jy kan hardloop die LS beveel om al die lêers in 'n gids in 'n lang-formaat saam met die tyd bevel. Die resultate van die tyd bevel sal soos volg wees: ware 0m0.177s gebruiker 0m0.156s sys 0m0.020s die vertoon statistieke toon die totale tyd geneem het om die bevel, die bedrag van die tyd wat bestee is in die gebruiker af en die bedrag hardloop tyd nodig vir kern af. As jy 'n program wat jy geskryf het en wat jy wil om te werk aan prestasie kan jy dit oor en oor loop saam met die tyd bevel en probeer verbeter op die statistieke. By verstek die uitset vertoon aan die einde van die program, maar miskien het jy wil hê dat die uitset te gaan na 'n lêer. Om uitvoerwaardes die formaat na 'n lêer te gebruik die volgende opdrag: tyd o ltfiletowritetogt ltcommandgt ltcommand switchesgt tyd --output61ltfiletowritetogt ltcommandgt ltcommand switchesgt Al die skakelaars vir die tyd bevel moet gespesifiseer voor die opdrag wat jy wil uit te voer. As jy 'performance tuning dan kan jy die uitvoer van die tyd bevel oor en oor te voeg tot dieselfde lêer, sodat jy 'n tendens kan sien. Lees verder onder om dit te doen gebruik die volgende opdrag in plaas: tyd - a ltfiletoappendtogt ltcommandgt ltcommand switchesgt tyd --append ltfiletoappendtogt ltcommandgt ltcommand switchesgt Formatering Die uitset van die tyd bevel by verstek die produksie is soos volg: real 0m0.177s gebruiker 0m0.156s sys 0m0.020s Daar is 'n groot aantal opmaak opsies soos getoon deur die volgende lys C - Naam en command line argumente gebruik D - gemiddelde grootte van die process39s ongedeelde data gebied kilogrepe E - tydsverloop in 'n klok formaat F - nommer van bladsy foute ek - nommer van lêer stelsel insette deur die proses K - Gemiddelde totale geheue gebruik van die proses in kilogrepe M - Maksimum inwoner stel grootte van die proses tydens die leeftyd in Kilobytes O - nommer van lêer stelsel uitgange deur die proses P - Persentasie van CPU dat die werk ontvang R - aantal kleiner of verhaalbaar bladsy foute S - die totale aantal CPU sekondes gebruik word deur die stelsel in kern af U - die totale aantal CPU sekondes gebruik word deur die gebruiker modus W - aantal kere wat die proses is omgeruil van hoofgeheue X - Gemiddelde hoeveelheid gedeelde teks in die proses Z - System39s bladsy grootte in kilogrepe c - Aantal kere die proses is konteks aangeskakel e - Verstreke real time deur die proses in sekondes k - aantal seine afgelewer word by die proses p - Gemiddelde ongedeelde stapel grootte van die proses in kilogrepe r - nommer van aansluiting boodskappe deur die proses te ontvang - nommer van aansluiting boodskappe deur die proses t gestuur - gemiddelde inwoner stel grootte van die proses in kilogrepe w - nommer van tyd die proses was konteks aangeskakel vrywillig x - Exit status van die bevel Jy kan die uitleg skakelaars gebruik soos volg: tyd-f 34Elapsed tyd 61 E, insette ek, uitsette O34 ltcommandgt die uitset vir bogenoemde opdrag sou so iets wees: tydsverloop 61 0: 01:00, insette 2, Uitsette 1 Jy kan meng en pas die skakelaars soos vereis. As jy wil 'n nuwe lyn soos volg te voeg as deel van die formaat string gebruik die NEWLINE karakter: tyd-f 34Elapsed Tyd 61 E N Insette I n Uitsette O34 ltcommandgt Opsomming Om uit te vind meer oor die tyd bevel van die Linux Handleiding Page lees deur hardloop die volgende opdrag: die formaat skakelaar doesn39t werk dadelik binne Ubuntu. Jy moet die opdrag uit te voer soos volg: Linux en Unix printf opdrag Formaat Die formaat string bevat drie soorte voorwerpe: gewone karakters. wat woordeliks kopieer na die uitset. geïnterpreteer karakter rye, wat oorgebly het met 'n back slash (). omskakeling spesifikasies, wat die wyse waarop ARGUMENT s sal uitgedruk word as deel van die opbrengs te definieer. Hier is 'n vinnige voorbeeld wat hierdie drie tipes voorwerpe gebruik: Hierdie opdrag produseer die afvoer: Hier is FORMAAT tussen dubbele aanhalingstekens (). Daar is 'n sukses spesifikasie: s. wat interpreteer die argument Johannes vir 'n string en voeg dit in die uitset. Daar is drie ontsnap karakter rye: twee voorkomste van en een voorkoms van N. Die volgorde vertaal as 'n letterlike dubbel kwotasie dit het met 'n back slash sodat printf weet om dit te hanteer as 'n letterlike karakter, en nie as die einde van die teken reeks. N is die volgorde vir 'n nuwe reël karakter, en vertel printf om 'n nuwe lyn te begin en die uitset voort van daar af. Die krag van printf lê in die feit dat vir enige gegewe formaat string, kan die argument te s verander om die uitset beïnvloed. Byvoorbeeld, kan die opbrengs van die opdrag in die bogenoemde voorbeeld word verander net deur die verandering van die argument, John. Indien dit gebruik word in 'n script. hierdie argument kan ingestel word om 'n veranderlike. Byvoorbeeld, sal die bevel van die waarde van die omgewing veranderlike LOGNAME voeg. wat is die rekening van elkeen hardloop die opdrag. Gesprek Spesifikasies Elke omskakeling spesifikasie begin met 'n en eindig met 'n doelskop karakter. Tussen die en die omskakeling karakter daar ook mag wees, ten einde 'n minusteken. Dit sê vir printf te verlaat-pas die omskakeling van die argument. 'N heelgetal wat veld breedte printf spesifiseer 'n omskakeling van 'n argument te druk in 'n veld ten minste aantal karakters breed. As dit nodig is, sal dit opgestopte aan die linkerkant (regs, indien links-aanpassing genoem vir) te make-up die breedte veld. 'N tydperk, wat die veld breedte van die presisie skei. 'N heelgetal, die presisie, wat die maksimum aantal karakters spesifiseer om te druk nie uit 'n string, of die nommer van syfers na die desimale punt van 'n swaai-punt waarde, of die minimum aantal syfers vir 'n heelgetal. Hierdie onderskeid tussen 'n kort en 'n lang heelgetal, onderskeidelik, en is oor die algemeen net wat nodig is vir rekenaarprogrammering. Die omskakeling karakters hulself, wat printf watter soort argument om te verwag vertel, is soos volg: Let asseblief daarop dat printf vereis dat die getal omskakeling snare om die aantal van 'n argument te pas is dit kaarte hulle een-tot-een, en verwag om presies te vind een argument vir elke omskakeling string. Die enigste uitsondering is 'n doelskop string wat 'n asterisk soos snare benodig twee argumente elke gebruik. Gesprek snare is altyd vertolk van links na regs. Byvoorbeeld, die volgende printf opdrag: produseer die volgende afvoer: verduidelik Ontsnap Character rye Die volgende karakter rye geïnterpreteer as spesiale karakters deur printf: druk 'n dubbel-aanhaling () druk 'n agteroorskuinsstreep () reik 'n waarskuwing (speel 'n klokkie) afdrukke 'n back space opdrag printf nie verder uitset druk produseer 'n ontsnapping karakter (ASCII kode 27) druk 'n horisontale blad druk 'n vertikale blad 'n greep met oktale waarde NNN (1 tot 3 syfers) druk 'n greep met hexadecinal waarde HH (1 tot 2 druk syfers) druk die Unicode karakter met heksadesimale waarde HHHH (4 syfers) druk die Unicode karakter met heksadesimale waarde HHHHHHHH (8 syfers) druk argument as 'n string met ontsnappings geïnterpreteer soos hierbo gelys, met die uitsondering dat oktale ontsnappings in die vorm 0 of 0 NN Aanhaling in die dop Wees versigtig met die manier waarop jou dop interpreteer aangehaal snare. As jou dop jou aangehaal string nie korrek te interpreteer, probeer om met behulp enkel-aanhalings eerder as dubbel aanhalingstekens. printf voorbeelde druk die volgende afvoer: druk die dieselfde uitset as die voorbeeld hierbo. Druk 'n string wat jy vertel die ligging van jou huis gids. Verwante opdragte AWK mdash Interpreter vir die AWK teks verwerking programmeertaal. BC mdash 'n sakrekenaar. eggo mdash Uitgawe text. printf (3) - Linux man bladsy Oorsig int printf (. const char formaat) Int fprintf (. FILE stroom, konst kar formaat) Int sprintf (. char str, konst kar formaat) Int snprintf (char str, sizet grootte, konst kar formaat.) Int vprintf (const char formaat, valist AP) Int vfprintf (lêer stroom, konst kar formaat, valist AP) Int vsprintf (char str, konst kar formaat, valist AP) Int vsnprintf (char str, sizet grootte, konst kar formaat, valist AP) funksie toets Makro Vereistes vir glibc (sien featuretestmacros (7)): snprintf (), vsnprintf (): BSDSOURCE XOPENSOURCE GT 500 ISOC99SOURCE POSIXCSOURCE GT 200112L of cc - stdc99 Beskrywing die funksies in die printf () familie produkte uitvoer volgens 'n formaat soos hieronder beskryf. Die funksies printf () en vprintf () skryf uitset na stdout. die standaard uitset stroom fprintf () en vfprintf () skryf uitset na die gegewe uitset stroom sprintf (), snprintf (), vsprintf () en vsnprintf () skryf aan die karakterstring str. Die funksies snprintf () en vsnprintf () skryf by die meeste groot grepe (insluitend die beëindiging van nul byte (0)) om Str. Die funksies vprintf (), vfprintf (), vsprintf (), vsnprintf () is gelykstaande aan die funksies printf (), fprintf (), sprintf (), snprintf (), onderskeidelik, behalwe dat hulle geroep is met 'n valist in plaas van 'n veranderlike aantal argumente. Hierdie funksies nie bel die vaend makro. Omdat hulle die vaarg makro roep, is die waarde van AP ongedefinieerd na die oproep. Sien stdarg (3). Hierdie agt funksies skryf die uitset onder die beheer van 'n formaat string wat spesifiseer hoe daaropvolgende argumente (of argumente via die veranderlike lengte argument fasiliteite van stdarg (3)) word omgeskakel na uitset. C99 en POSIX.1-2001 spesifiseer wat die resultate is ongedefinieerd as 'n oproep tot sprintf (), snprintf (), vsprintf (), of vsnprintf () sou veroorsaak kopiëring plaasvind tussen voorwerpe wat oorvleuel (bv as die teiken string array en een van die verskaf insette argumente verwys na dieselfde buffer). Sien notas. Terug waarde Na suksesvolle terugkeer, hierdie funksies standaard van die aantal karakters gedruk (met uitsondering van die nul byte wat gebruik word om uitset te snare eindig). Die funksies snprintf () en vsnprintf () nie meer as grootte grepe (insluitend die beëindiging van nul byte (0)) skryf. As die uitset is afgekap as gevolg van hierdie beperking dan die terugkeer waarde is die aantal karakters (met uitsondering van die beëindiging van nul byte) wat sou gewees het geskryf om die finale string as genoeg ruimte beskikbaar was. Dus, 'n terugkeer waarde van grootte of meer beteken dat die uitset is afgesny. (Sien ook hieronder onder NOTAS.) As 'n uitset fout teëgekom word, is 'n negatiewe waarde teruggekeer. Formaat van die formaat string Die formaat string is 'n karakterstring, begin en eindig in die oorspronklike verskuiwing staat, indien enige. Die formaat string bestaan ​​uit nul of meer voorskrifte: gewone karakters (nie), wat onveranderd is gekopieer na die uitset stroom en omskakeling spesifikasies, elk van wat lei tot haal nul of meer daaropvolgende argumente. Elke omskakeling spesifikasie is ingestel deur die karakter. en eindig met 'n doelskop specific. In tussen is daar dalk (in hierdie volgorde) nul of meer vlae. 'n opsionele minimum veld breedte. 'n opsionele presisie en 'n opsionele lengte wysiger. Die argumente moet behoorlik ooreenstem (ná tipe promosie) met die omskakeling specific. By verstek, is die argumente wat in die gegewe volgorde, waar ieder en elk omskakeling specific vra vir die volgende argument (en dit is 'n fout as onvoldoende baie argumente word gegee). 'N Mens kan ook spesifiseer uitdruklik wat argument geneem word, by elke plek waar 'n argument word vereis nie, word deur die skryf van m in plaas van en m in plaas van, waar die desimale heelgetal m dui die posisie in die argument lys van die verlangde argument, geïndekseer vanaf 1 . So, en is ekwivalent. Die tweede styl kan herhaalde verwysings na dieselfde argument. Die C99 standaard sluit nie die styl met behulp van wat kom van die interne UNIX-spesifikasie. As die styl met behulp gebruik word, moet dit deurgaans gebruik word vir alle doelskoppe neem 'n argument en al breedte en presisie argumente, maar dit kan gemeng word met formate wat nie 'n argument nie verteer. Daar mag geen gapings in die getalle van argumente gespesifiseerde behulp Byvoorbeeld, as argumente 1 en 3 vermeld, argument 2 moet ook iewers vermeld in die formaat string. Vir een of ander numeriese doelskoppe n radix karakter (desimale punt) of duisende groepering karakter gebruik. Die werklike karakter gebruik hang af van die LCNUMERIC deel van die land. Die POSIX land gebruik. as Radix karakter, en nie 'n groepering karakter. Dus, lei tot 1.234.567,89 in die POSIX land, in 1234567,89 in die nlNL land, en in 1.234.567,89 in die daDK land. Die vlag karakters die karakter word gevolg deur nul of meer van die volgende vlae: Die waarde moet omgeskakel word na 'n alternatiewe vorm. Vir o doelskoppe, is die eerste karakter van die uitset string gemaak nul (as voorvoegsel n 0 indien dit was nie nul is nie). Vir x en x doelskoppe, 'n nie-nul gevolg het die string 0x (of 0X vir X doelskoppe) prepended om dit te. Vir 'n . A. e. E. f. F. g. en G doelskoppe, sal die resultaat altyd bevat 'n desimale punt, selfs al is geen syfers volg dit (gewoonlik, blyk 'n desimale punt in die resultate van die doelskoppe slegs indien 'n syfer volg). Vir g en G doelskoppe, is sleep nulle nie van die uitslag verwyder aangesien hulle andersins sou wees. Vir ander doelskoppe, die resultaat is ongedefinieerd. Die waarde moet nul opgestopte wees. Vir d. Ek. o. u. x. X. a. A. e. E. f. F. g. en G doelskoppe, die bekeerde waarde is opgestopte aan die linkerkant met nulle eerder as spasies. As die 0 en - vlae beide verskyn, is die 0 vlag geïgnoreer. As 'n presisie gegee met 'n numeriese omskakeling (d. I. V. U. X. En X), die 0 vlag geïgnoreer. Vir ander doelskoppe, die gedrag is ongedefinieerd. Die bekeerde waarde is gelaat aangepas op die veld grens. (Die verstek is reg regverdiging.) Behalwe vir N doelskoppe, die bekeerde waarde is opgestopte op die regte met spasies, eerder as aan die linkerkant met spasies of nulle. A - oorheers 'n 0 indien beide word. ( 'N spasie) 'n leeg gelaat moet word voordat 'n positiewe getal (of leë string) wat deur 'n getekende omskakeling. 'N teken (of -) moet altyd voor 'n aantal deur 'n getekende omskakeling geplaas. By verstek 'n teken is slegs gebruik word vir negatiewe getalle. A oorheers 'n spasie indien beide word gebruik. Die vyf vlag karakters hierbo omskryf in die C standaard. Die SUSv2 spesifiseer een verdere vlag karakter. Vir desimale omskakeling (i. D. U. F. F. G. G) die uitset word gegroepeer met duisende groepering karakters as die land inligting dui enige. Let daarop dat baie weergawes van gcc (1) kan nie hierdie opsie ontleed en sal 'n waarskuwing uit te reik. SUSv2 sluit nie F. glibc 2.2 voeg een verdere vlag karakter. Ek Vir desimale heelgetal omskakeling (i. D. U) die uitset gebruik die lokaliteite alternatiewe uitset syfers, indien enige. Byvoorbeeld, sedert glibc 2.2.3 dit sal Arabies-Indiese syfers in die Persiese (billike) land gee. Die veld breedte 'n opsionele desimale syfer string (met nie-nul eerste syfer) spesifiseer 'n minimum veld breedte. As die bekeerde waarde minder karakters as die wydte veld, sal dit opgestop met spasies aan die linkerkant (regs, indien die linker-aanpassing vlag gegee). In plaas van 'n desimale syfer string een kan skryf of m (vir 'n paar desimale heelgetal m) te bepaal dat die wydte veld word in die volgende argument, of in die m - de argument, onderskeidelik, wat van tipe int moet wees. 'N negatiewe gebied breedte is geneem as 'n - vlag gevolg deur 'n positiewe veld breedte. In geen geval nie 'n nie-bestaande of klein breedte veld oorsaak afkorting van die veld as die resultaat van 'n omskakeling is wyer as die wydte veld, die veld uitgebrei om die omskakeling gevolg bevat. Die presisie n opsionele presisie, in die vorm van 'n punt (.) Gevolg deur 'n opsionele desimale syfer string. In plaas van 'n desimale syfer string een kan skryf of m (vir 'n paar desimale heelgetal m) te bepaal dat die akkuraatheid word in die volgende argument, of in die m-de argument, onderskeidelik, wat van tipe int moet wees. As die akkuraatheid gegee as net., Of die akkuraatheid negatief is, is die akkuraatheid geneem om nul wees. Dit gee die minimum aantal syfers verskyn vir d. Ek. o. u. x. en X doelskoppe, die nommer van syfers te verskyn nadat die radix karakter vir 'n. A. e. E. f. en F doelskoppe, die maksimum aantal beduidende syfers vir g en G doelskoppe, of die maksimum aantal van karakters word gedruk van 'n string vir s en S doelskoppe. Die lengte wysiger Hier heelgetal omskakeling staan ​​vir d. Ek. o. u. x. of X omskakeling. HH A volgende heelgetal omskakeling ooreenstem met 'n getekende kar of unsigned char argument, of 'n volgende N omskakeling ooreenstem met 'n verwysing na 'n getekende kar argument. A volgende heelgetal omskakeling ooreenstem met 'n kort int of unsigned kort int argument, of 'n volgende N omskakeling ooreenstem met 'n verwysing na 'n kort int argument. (El) 'n volgende heelgetal omskakeling ooreenstem met 'n lang int of unsigned long int argument, of 'n volgende N omskakeling ooreenstem met 'n verwysing na 'n lang int argument, of 'n volgende c omskakeling ooreenstem met 'n wintt argument, of 'n volgende e omskakeling ooreenstem 'n verwysing na argument wchart. (El-el). A volgende heelgetal omskakeling ooreenstem met 'n lang lang int of unsigned long lang int argument, of 'n volgende N omskakeling ooreenstem met 'n verwysing na 'n lang lang int argument. A na 'n. A. e. E. f. F. g. of G omskakeling ooreenstem met 'n lang dubbel argument. (C99 laat LF, maar SUSv2 nie.) (Quad. 4.4BSD en Linux libc5 net. Moenie gebruik.) Dit is 'n sinoniem vir ll. A volgende heelgetal omskakeling ooreenstem met 'n intmaxt of uintmaxt argument. A volgende heelgetal omskakeling ooreenstem met 'n sizet of ssizet argument. (Linux libc5 het Z met hierdie betekenis. Moenie dit gebruik.) 'N volgende heelgetal omskakeling ooreenstem met 'n ptrdifft argument. Die SUSv2 weet net oor die lengte wysigers h (in HD. Hi. Ho. Hx. HX. HN) en l (in ld. Li. Lo. LX. LX. Ln. LC. LS) en L (Le. LE . LF. Lg. LG). Die omskakeling specific 'n karakter wat die tipe omskakeling spesifiseer wat toegepas moet word. Die omskakeling spesifiseerders en hulle betekenisse word: d. Ek, die int argument word omgeskakel na onderteken desimale notasie. Die presisie, indien enige, gee die minimum aantal syfers wat moet verskyn indien die bekeerde waarde minder syfers vereis, is dit opgestopte aan die linkerkant met nulle. Die standaard presisie is 1. Wanneer 0 gedruk met 'n eksplisiete presisie 0, die uitset is leeg. o. u. x. X Die ongetekende int argument word omgeskakel na ongetekende oktale (o), unsigned desimale (u), of unsigned heksadesimale (x en X) notasie. Die briewe ABCDEF word vir x doelskoppe die letters ABCDEF word gebruik vir X doelskoppe. Die presisie, indien enige, gee die minimum aantal syfers wat moet verskyn indien die bekeerde waarde minder syfers vereis, is dit opgestopte aan die linkerkant met nulle. Die standaard presisie is 1. Wanneer 0 gedruk met 'n eksplisiete presisie 0, die uitset is leeg. e. E Die dubbel argument word afgerond en omskep in die styl d. ddd e dd waar daar een syfer voor die desimale punt karakter en die nommer van syfers na dit gelyk aan die presisie as die akkuraatheid ontbreek is, is dit beskou as 6 as die akkuraatheid is nul, geen desimale punt karakter verskyn. 'N E omskakeling gebruik die letter E (eerder as e) om die eksponent stel. Die eksponent bevat altyd ten minste twee syfers indien die waarde nul is, die eksponent 00. Die dubbel argument word afgerond en omgeskakel word na desimale notasie in die styl - ddd. ddd, waar die aantal syfers na die desimale punt karakter is gelyk aan die akkuraatheid spesifikasie. As die akkuraatheid ontbreek, dit is ingeneem as 6 as die akkuraatheid is uitdruklik nul, geen desimale punt karakter verskyn. As 'n desimale punt verskyn, verskyn ten minste een syfer voor dit. (Die SUSv2 nie weet F en sê dat karakterstring vertoë vir oneindigheid en NaN beskikbaar gemaak kan word. Die C99 standaard spesifiseer - inf of - infinity vir oneindigheid, en 'n string begin met nan vir NaN, in die geval van f omskakeling en - INF of - INFINITY of NAN in die geval van F omskakeling.) g. G Die dubbel argument omgeskakel in styl f of e (of F of E vir G doelskoppe). Die presisie spesifiseer die aantal beduidende syfers. As die akkuraatheid ontbreek, is 6 syfers gegee word indien die akkuraatheid is nul, word dit as 1. Styl e gebruik as die eksponent van sy sukses is minder as -4 of groter as of gelyk aan die akkuraatheid. Sleep nulle verwyder uit die breukdeel van die resultaat 'n desimale punt verskyn slegs indien dit word gevolg deur ten minste een syfer. (C99 nie in SUSv2) Vir 'n doelskop, die dubbele argument word omgeskakel na heksadesimale notasie (met behulp van die letters ABCDEF) in die styl - 0x h. HHHH p vir 'n omskakeling van die voorvoegsel 0X. die letters ABCDEF, en die eksponent separator P gebruik word. Daar is een heksadesimale syfer voor die desimale punt en die nommer van syfers na dit gelyk aan die akkuraatheid is. Die standaard presisie voldoende vir 'n presiese weergawe van die waarde as 'n presiese voorstelling in basis 2 bestaan, en anders is groot genoeg om waardes van tipe dubbel onderskei. Die syfer voor die desimale punt is ongespesifiseerde vir nonnormalized getalle en nul, maar anders ongespesifiseerde vir genormaliseer getalle. Indien geen l wysiger teenwoordig is, is die int argument omgeskakel word na 'n unsigned char. en die gevolglike karakter geskryf word. As 'n l wysiger teenwoordig is, is die wintt (wye karakter) argument omgeskakel word na 'n multibyte volgorde deur 'n oproep om die wcrtomb (3) funksie, met 'n doelskop staat begin in die aanvanklike toestand, en die gevolglike multibyte string geskryf is. Indien geen l wysiger teenwoordig is: Die const char argument word verwag om 'n verwysing na 'n verskeidenheid van karakter tipe (wyser na 'n string) wees. Karakters uit die reeks geskryf tot (maar nie insluitend) 'n tydelike nul byte (0) as 'n presisie gespesifiseer, nie meer as die gespesifiseerde aantal geskryf. As 'n presisie gegee, hoef geen nul byte teenwoordig wees as die akkuraatheid nie gespesifiseer word nie, of groter is as die grootte van die skikking, moet die skikking 'n tydelike nul byte bevat. As 'n l wysiger teenwoordig is: Die const wchart argument word verwag om 'n verwysing na 'n verskeidenheid van groot karakters wees. Wye karakters van die skikking word omgeskakel na multibyte karakters (elk deur 'n oproep om die wcrtomb (3) funksie, met 'n doelskop staat begin in die aanvanklike toestand voor die eerste groot karakter), tot en met 'n beëindiging van nul wye karakter. Die gevolglike multibyte karakters geskryf tot (maar nie insluitend) die beëindiging van nul byte. As 'n presisie gespesifiseer, daar is geen grepe meer as die gespesifiseerde aantal geskryf, maar geen gedeeltelike multibyte karakters geskryf. Let daarop dat die akkuraatheid bepaal die nommer van grepe geskryf, nie die aantal wye karakters of skerm posisies. Die skikking moet 'n beëindiging van nul wye karakter bevat, tensy 'n presisie gegee en dit is so klein dat die aantal grepe geskryf oorskry dit voor die einde van die skikking is bereik. C (Nie in C99, maar in SUSv2.) Synoniem van LC. Moenie gebruik. (Nie in C99, maar in SUSv2.) Synoniem van LS. Moenie gebruik. Die leemte wyser argument is gedruk in heksadesimale (asof deur x of LX). Die aantal karakters tot dusver geskryf is gestoor in die aangedui deur die int (of variant) wyser argument heelgetal. Geen argument omgeskakel. (Glibc uitbreiding.) Druk uitset van strerror (Errno). Geen argument word vereis nie. A is geskryf. Geen argument omgeskakel. Die volledige omskakeling spesifikasie is. Wat voldoen aan die fprintf (), printf (), sprintf (), vprintf (), vfprintf (), en vsprintf () funksies in ooreenstemming met C89 en C99. Die snprintf () en vsnprintf () funksies in ooreenstemming met C99. Met betrekking tot die terugkeer waarde van snprintf (), SUSv2 en C99 weerspreek mekaar: wanneer snprintf () genoem word met grootte 0 dan SUSv2 bepaal 'n ongespesifiseerde terugkeer waarde minder as 1, terwyl C99 laat str om NULL wees in hierdie geval, en gee die terugkeer waarde (soos altyd) as die aantal karakters wat in die geval sou geskryf die uitset string het genoeg groot is. Linux libc4 weet oor die vyf C standaard vlae. Dit weet oor die lengte wysigers h. l. L. en die herleiding c. d. e. E. f. F. g. G. Ek. N. o. p. s. u. x. en X. waar F 'n sinoniem vir f. Daarbenewens is dit aanvaar D. O. en U as sinonieme vir ld. kyk. en lu. (Dit is sleg, en veroorsaak ernstige foute later, wanneer ondersteuning vir D verdwyn.) Geen land afhanklik Radix karakter, geen duisende skeier, geen NaN of oneindig, geen m en m. Linux libc5 weet oor die vyf C standaard vlae en die vlag, land, m en m. Dit weet oor die lengte wysigers h. l. L. Z . en q. maar aanvaar L en q beide vir 'n lang dubbel en vir 'n lang lang int (dit is 'n fout). Dit nie meer erken F. D. O. en jy . maar voeg die omskakeling karakter m. wat uitgange strerror (Errno). glibc 2.0 voeg omskakeling karakters C en S. glibc 2.1 voeg lengte wysigers HH. j. t. en Z en omskakeling karakters a en a. glibc 2.2 voeg die omskakeling karakter F met C99 semantiek, en die vlag karakter ek. Notes Sommige programme imprudently staatmaak op-kode soos die volgende sprintf (BUF, is 'n paar verdere inligting, BUF) om teks voeg tot BUF. Maar die standaarde uitdruklik daarop dat die resultate is ongedefinieer as bron en bestemming buffers oorvleuel wanneer ek bel sprintf (), snprintf (), vsprintf (), en vsnprintf (). Afhangende van die weergawe van GCC (1) gebruik, en die samesteller opsies in diens, noem soos die bogenoemde sal nie die verwagte resultate te produseer. Die glibc implementering van die funksies snprintf () en vsnprintf () voldoen aan die C99 standaard, dit is, optree soos hierbo beskryf, aangesien glibc weergawe 2.1. Tot glibc 2.0.6 sal hulle terugkeer -1 wanneer die uitset is afgesny. Foute Omdat sprintf () en vsprintf () neem 'n arbitrêr lang tou, moet bellers versigtig wees om nie die werklike ruimte is dit dikwels onmoontlik om te verseker oorloop wees. Let daarop dat die lengte van die snare geproduseer is Locale-afhanklike en moeilik om te voorspel. Gebruik snprintf () en vsnprintf () plaas (of asprintf (3) en vasprintf (3)). Linux libc4.45 nie 'n snprintf (), maar bied 'n libbsd dat 'n snprintf () gelyk aan sprintf (bevat), dit wil sê, die een wat die grootte argument ignoreer. So, die gebruik van snprintf () met 'n vroeë libc4 lei tot ernstige sekuriteit probleme. Kode soos printf (cat) dui dikwels 'n fout, want cat 'n karakter kan bevat. As cat kom uit vertrou toevoer van die gebruiker, kan dit n bevat. veroorsaak dat die printf () oproep om te skryf aan geheue en die skep van 'n sekuriteit gat. Voorbeeld vir Pi druk tot vyf desimale plekke: Om 'n datum en tyd in die vorm Sondag 3 Julie, 10:02, waar weekdag en maand is verwysings na snare te druk: Baie lande gebruik die dag-maand-jaar einde. Dus, moet 'n internasionale gemeenskap weergawe in staat wees om die argumente in 'n bevel wat deur die formaat druk: waar formaat hang af van land, en kan die argumente verwisselen. Met die waarde: 'n mens kan kry Sonntag, 3. Juli, 10:02. Om 'n groot genoeg tou te ken en te druk in dit (kode korrek vir beide glibc 2.0 en glibc 2.1): As afkorting voorkom in glibc weergawes voor 2.0.6, is dit beskou as 'n fout in plaas daarvan om grasieus hanteer. Sien ook ByBasically verwys word, dit is 'n port (en betroubaarheid) kwessie. Aanvanklik, eggo didnt aanvaar geen opsie en didnt enigiets uit te brei. Al wat dit doen is sy argumente 'n spasie geskei karakter en beëindig deur 'n NEWLINE karakter uitdruk. Nou, iemand het gedink dit sal lekker wees as ons dinge nie kan doen soos nt eggo om uitset NEWLINE of blad karakters, of het 'n opsie om uitset die sleep NEWLINE karakter. Hulle het toe gedink harder, maar in plaas van die toevoeging dat funksie om die dop (soos Perl waar binne dubbele aanhalingstekens, t eintlik beteken 'n blad karakter), het hulle bygevoeg dat dit eggo. David Korn besef die fout en 'n nuwe vorm van die dop aanhalings:. wat later gekopieer deur bash en zsh maar dit het ver te laat teen daardie tyd. En toe 'n standaard Unix eggo ontvang 'n argument wat die twee karakters en t bevat. in plaas daarvan uitdruk, wat dit uitset n blad karakter. En sodra dit sien c in 'n argument, dit tot stilstand kom uitdruk (so die sleep NEWLINE is nie uitvoer nie). Ander doppe / Unix verkopers / weergawes verkies om dit anders te doen: hulle het 'n - e opsie om te ontsnap rye uit te brei, en 'n - n opsie om nie uitset die sleep NEWLINE bygevoeg. Sommige het 'n - E te ontsnap rye te skakel, 'n paar het - n maar nie - e. die lys van ontsnapping rye deur een eggo implementering is nie noodwendig dieselfde as deur 'n ander. Op daardie eggo implementering wat opsies te ondersteun, Theres algemeen geen ondersteuning van 'n - (zsh en moontlik ander te ondersteun - want dit al) aan die einde van opsies te merk, sodat byvoorbeeld sy moeilik om uitset - n met eggo in baie doppe. Op sommige doppe soos bash 1 of ksh93 2 of Yash (ECHOSTYLE veranderlike), die gedrag hang selfs oor hoe die dop is saamgestel of die omgewing (GNU eggo se gedrag sal ook verander as POSIXLYCORRECT is in die omgewing). So twee bash eggo s, selfs van dieselfde weergawe van bash is nie gewaarborg om dieselfde te tree. POSIX sê: As die eerste argument is - n of enige argument bevat skuinsstrepe, dan is die gedrag is ongespesifiseerde. bash eggo in dié verband is nie POSIX in daardie byvoorbeeld eggo-e is nie uitdruk - eltnewlinegt as POSIX vereis. Die Unix spesifikasie is strenger, dit verbied - n en vereis uitbreiding van 'n paar ontsnapping rye insluitend die c een om op te hou uitdruk. Diegene spesifikasies nie regtig kom tot die redding hier gegee dat baie implementering is nie voldoen. Alles in ag genome, jy nie weet wat eggo var wil uitvoer nie, tensy jy kan seker maak dat var nie die geval bevat agteroorskuinsstreep karakters en nie die geval begin met -. Die POSIX spesifikasie nie eintlik vir ons sê om printf gebruik in plaas in so 'n geval. So, wat dit beteken is dat jy eggo cant gebruik om onbeheerde data voor te stel. Met ander woorde, as jy 'n script te skryf en dit neem eksterne insette (van die gebruiker as argumente, of lêername van die lêer stelsel.), Jy kan nie eggo gebruik om dit te vertoon. (Al is dit OK met 'n paar (nie Unix) eggo implementering soos bash s sal werk wanneer die opsie xpgecho het nie in 'n manier is aangeskakel of 'n ander soos by samestelling tyd of via die omgewing). printf. Aan die ander kant is meer betroubaar, ten minste wanneer sy beperk tot die basiese gebruik van eggo.


No comments:

Post a Comment