Monday, October 17, 2016

C Printf Format Codes Binary Options

Basiese beginsels van geformatteerde toevoer / Uitset in C Konsepte I / O is in wese gedoen een karakter (of byte) op 'n slag stroom - 'n reeks van karakters wat oorloop van een plek na 'n ander inset stroom. data vloei uit insette toestel (klawerbord, lêer, ens) in die geheue uitset stroom. data vloei uit die geheue te afvoertoestel (monitor, lêer, drukker, ens) Standard I / O strome (met ingeboude betekenis) stdin. standaard inset stroom (verstek is klawerbord) stdout. standaard uitset stroom stderr (verstek na monitor). standaardfout stroom stdio. h - bevat basiese I / O funksies scanf. lees van standaard insette (stdin) printf. skryf aan standaard uitset (stdout) Daar is ander soortgelyk aan printf funksies en scanf wat skryf en lees van ander strome Hoe om in te sluit nie, want C of C samesteller Geformateer I / O - verwys na die omskakeling van data na en van 'n stroom karakters, vir die druk (of lees) in plain text formaat teks I / O ons beskou formaat I / O Die ander opsie is om te lees / skryf van direkte binêre inligting (algemeen met lêer I / O, byvoorbeeld) uitset met printf herhaling die basiese formaat van 'n printf funksie oproep is: waar: formatstring is die uitleg van whats gedruk listofexpressions is 'n komme geskeide lys van veranderlikes of uitdrukkings opbrengs resultate in die uitset na uitset karkaterkonstantes te plaas, net gebruik maak van een parameter op printf. die string self omskakelingsmerkers spesifiseer 'n sukses specific is 'n simbool wat gebruik word as 'n plekhouer in 'n formaat string. Vir heelgetal uitset (byvoorbeeld), d is die specific dat die plek vir heelgetalle hou. Hier is 'n paar wat algemeen gebruik word omskakelingsmerkers spesifiseer (nie 'n volledige lys): Druk heelgetalle na uitset 'n heelgetal, gebruik d in die formaat string, en 'n heelgetal uitdrukking in die listofexpressions. Ons kan die veld wicth spesifiseer (bv hoeveel ruimtes die item afdrukke in). Standaard na regs-regverdiging. Plaas 'n getal tussen die en die d. In hierdie voorbeeld veld breedte is 10: na links regverdig, gebruik 'n negatiewe getal in die breedte veld: As die breedte veld is te klein of links ongespesifiseerde, dit verstek na die minimum aantal karakters wat nodig is om die item te druk: Spesifisering die veld wydte is baie handig wanneer die druk van verskeie reëls van uitset wat bedoel is om in lyn in 'n tabel formaat druk swaai-punt getalle Gebruik die f wysiger te druk swaai punt waardes in vaste skryfwyse: Gebruik e vir eksponensiële notasie: Let daarop dat die E02 beteken keer 10 tot die 2de krag Jy kan ook beheer oor die desimale presisie, wat is die aantal plekke na die desimale. Uitset sal rond om die toepaslike aantal desimale plekke, indien nodig: Veld breedte ook beheer kan word, soos met heelgetalle: In die omskakeling specific, die aantal voordat die desimale is veld breedte, en die aantal ná die akkuraatheid. (In hierdie voorbeeld, 9 en 2). -9,2 Sou links regverdig in 'n veld breedte van 9, soos met heelgetalle Druk karakters en stringe Gebruik die opmaak specific c vir karakters. Standaard veldgrootte is 1 karakter: Gebruik s vir die druk snare. Gebied breedtes werk net soos met heelgetalle: output. c - bevat al die bogenoemde voorbeeld uitgange. Probeer om dit te draai jouself scanf Basics Om data te lees in van standaard insette (klawerbord), ons die scanf funksie noem. Die basiese vorm van 'n oproep tot scanf is: die formaat string is soos dié van printf Maar in plaas van uitdrukkings, wat ons nodig het ruimte om inkomende data, vandaar die lys van veranderlike adresse stoor As x is 'n veranderlike, dan is die uitdrukking x beteken adres van x scanf voorbeeld: Gesprek spesifiseerders Meestal dieselfde as vir uitvoer. Sommige klein verskille Gebruik f vir tipe float. maar gebruik LF vir tipe dubbel en 'n lang dubbel die tipe data lees, die omskakeling specific, en die veranderlike gebruik behoefte aan te pas in tipe Wit ruimte oorgeslaan by verstek in agtereenvolgende numeriese lees. Maar dit is nie oorgeslaan vir karakter / string insette. Voorbeeld Voorbeeld run 1 gebruiker insette onderstreep, om dit te onderskei van die program uitvoer Voorbeeld Run 2 Let daarop dat in hierdie monster hardloop, die karakter wat gelees was nie die brief N. Dit was die ruimte. (Onthou, wit spasie nie oorgeslaan op karakter lees). Dit kan in berekening gebring word. Oorweeg indien die scanf lyn lyk soos hierdie: Daar is 'n ruimte betwen die f en die C in die formaat string. Dit laat die gebruiker toe om 'n ruimte te tik. Veronderstel dit is die getikte insette: Dan sal die karakter veranderlike c nou bevat die N. input2.c - 'n weergawe van die voorbeeld van hierdie verandering is gekoppel hier Interaktiewe insette wat jy kan insette meer interaktiewe deur waarna die gebruiker meer versigtig maak. Dit kan saai in sommige plekke, maar in baie gevalle, dit maak programme meer gebruikersvriendelik. Voorbeeld: 'n goeie manier om meer oor scanf leer is om verskeie insette in verskillende kombinasies en tipe probeer in toets gevalle - kyk wat gebeur printf / scanf met C-snare 'n Hele C-styl string maklik gedruk kan word, deur die gebruik van die s opmaak simbool, tesame met die naam van die kar verskeidenheid stoor die string (die argument te vul in daardie posisie): Wees versigtig om dit slegs te gebruik op char skikkings wat as C-styl snare word. (Dit beteken, slegs indien die nul karakter teenwoordig as 'n Terminator is). Net so kan jy 'n string in 'n kar verskeidenheid met scanf lees. Die volgende oproep kan die toetrede van 'n woord (tot 19 karakters en 'n beëindiging van nul karakter) van die sleutelbord, wat gestoor word in die skikking WORD1: Karakters word vanaf die sleutelbord totdat die eerste wit ruimte (spasie, blad, NEWLINE) karakter teëgekom. Die insette word gestoor in die karakter verskeidenheid en die nul karakter word outomaties bygevoeg. Let ook op dat die nie nodig was in die scanf oproep (WORD1 is gebruik, in plaas van WORD1). Dit is omdat die naam van die skikking op sigself (met geen indeks) is eintlik 'n veranderlike wat 'n adres ( 'n wyser).sprintf sprintf Wys 'n string formaat deur die gewone printf konvensies van die C-biblioteek funksie sprintf stoor. Sien hieronder vir meer besonderhede en sien sprintf (3) of printf (3) op jou rekenaar vir 'n verduideliking van die algemene beginsels. Perl doen sy eie sprintf opmaak: dit naboots die C-funksie sprintf (3). maar nie die geval is dit gebruik, behalwe vir swaai-punt nommers, en selfs dan net standaard wysigers word toegelaat nie. Nie-standaard uitbreidings in jou plaaslike sprintf (3) is dus nie beskikbaar vanaf Perl. In teenstelling met printf. sprintf nie doen wat jy waarskynlik beteken wanneer jy dit slaag 'n skikking as jou eerste argument. Die skikking word skalaar konteks, en in plaas van die gebruik van die 0 element van die skikking as die formaat, sal Perl die telling van elemente gebruik in die skikking as die formaat, wat byna nooit nuttig. Perls sprintf toelaat dat die volgende universeel bekende doelskoppe: Verder Perl toelaat dat die volgende wyd ondersteun doelskoppe: Ten slotte, vir agtertoe (en ons bedoel agtertoe) verenigbaarheid, Perl toelaat hierdie onnodige maar wyd ondersteun doelskoppe: Let daarop dat die aantal eksponent syfers in die wetenskaplike notasie geproduseer per e. E. g en g vir getalle met die modulus van die eksponent minder as 100 is stelsel afhanklik; miskien sal drie of minder (nul-opgestopte as wat nodig is). Met ander woorde, kan 1,23 maal tien tot die 99ste óf 1.23e99 of 1.23e099 wees. Net so vir 'n en A. die eksponent of die heksadesimale syfers kan dryf: veral die lang dubbelspel Perl opsie te kan verrassings veroorsaak. Tussen die letter en die formaat, kan jy 'n paar ekstra eienskappe beheer van die interpretasie van die formaat spesifiseer. Ten einde, dit is: 'n eksplisiete formaat parameter indeks, soos 2. By verstek sprintf die volgende ongebruikte argument in die lys sal klaarmaak, maar dit laat jou toe om die argumente te neem buite werking: Wanneer 'n spasie en 'n plus-teken gegee as die vlae op een slag, is die ruimte geïgnoreer. Wanneer die vlag en 'n presisie word in die o omskakeling, is die akkuraatheid geïnkrementeer as sy nodig is vir die voorste 0. Hierdie vlag vertel Perl die verskaf string as 'n vektor van heelgetalle, een vir elke karakter in die string te interpreteer. Perl pas die formaat aan elke heelgetal op sy beurt, dan sluit die gevolglike snare met 'n separator (a dot. By verstek). Dit kan nuttig wees vir die vertoon van ordinale waardes van karakters in arbitrêre snare wees: Sit 'n asterisk voor die v om die string te omseil om te gebruik om die getalle te skei: Jy kan ook uitdruklik spesifiseer die argument nommer te gebruik vir die sluit string met behulp van iets soos 2v vir byvoorbeeld: Argumente word gewoonlik geformateer om net so wyd as wat nodig is om die gegewe waarde vertoon word. Jy kan die wydte oorheers deur 'n aantal hier, of kry die wydte van die volgende argument (met) of van 'n bepaalde argument (bv met 2): As 'n stuk grond breedte verkry deur negatief, dit het dieselfde uitwerking as die - vlag: links-regverdiging. Jy kan 'n presisie (vir numeriese doelskoppe) of 'n maksimum breedte (vir string doelskoppe) spesifiseer deur die spesifiseer van 'n. gevolg deur 'n aantal. Vir swaai-punt formate behalwe g en G. spesifiseer hierdie hoeveel plekke regterkant van die desimale punt om te wys (die verstek om 6). Byvoorbeeld: Vir g en G, hierdie spesifiseer die maksimum aantal syfers aan te toon, insluitend dié voor die desimale punt en diegene nadat dit byvoorbeeld: Vir heelgetal doelskoppe, spesifiseer 'n presisie impliseer dat die opbrengs van die getal self nul moet wees - padded hierdie breedte, waar die 0 vlag geïgnoreer: vir string doelskoppe, spesifiseer 'n presisie truncates die string na die gespesifiseerde wydte pas: Jy kan ook die akkuraatheid te kry uit die volgende argument met behulp van .. of van 'n bepaalde argument (bv met 0,2): as 'n presisie verkry deur negatief, dit tel as sonder presisie glad. Vir numeriese doelskoppe, kan jy die grootte van die aantal interpreteer as die gebruik van l spesifiseer. h. V. V. L. of ll. Vir heelgetal doelskoppe (DUOX X bi DUO), is getalle gewoonlik aangeneem dat dit alles die verstek heelgetal grootte is op jou platform (gewoonlik 32 of 64 stukkies), maar jy kan dit ignoreer om plaas een van die standaard tipes C gebruik, soos ondersteun deur die samesteller gebruik om Perl bou: Vanaf 5.14, geeneen van hierdie verhoog 'n uitsondering as hulle nie ondersteun op jou platform. Maar as waarskuwings geaktiveer is, 'n waarskuwing van die printf waarskuwing klas uitgereik op 'n nie-ondersteunde omskakeling vlag. Indien u in plaas verkies 'n uitsondering, doen dit: As jy wil weet oor 'n weergawe afhanklikheid voor jy begin hardloop die program, het iets soos hierdie op sy top: Jy kan uitvind of jou Perl ondersteun quads via Config: Vir floating - punt doelskoppe (EFG EFG), is getalle gewoonlik aanvaar dat die verstek swaai-punt grootte van jou platform (dubbel of lang dubbel) wees, maar jy kan 'n lang dubbel dwing met Q. L. of ll as jou platform ondersteun hulle. Jy kan uitvind of jou Perl ondersteun lang dubbelspel via Config: Jy kan uitvind of Perl mening lang dubbel die standaard swaai-punt grootte van jou platform te gebruik via Config wees: Dit kan ook wees dat die lang dubbelspel en dubbelspel is dieselfde ding: Die grootte specific V het geen effek vir Perl kode, maar word ondersteun vir verenigbaarheid met XS-kode. Dit beteken die gebruik van die standaard grootte vir 'n Perl heelgetal of swaai-punt nommer, wat is die standaard. Normaalweg sprintf neem die volgende ongebruikte argument as die waarde wat u wil regmaak vir elke formaat spesifikasie. As die formaat spesifikasie gebruik om bykomende argumente vereis, word hierdie verbruik van die argument lys in die volgorde waarin hulle verskyn in die formaat spesifikasie voor die waarde-formaat. Waar 'n argument is wat deur 'n uitdruklike indeks, beteken dit geen invloed op die normale orde vir die argumente, selfs wanneer die uitdruklik vermeld indeks die volgende argument sou gewees het. gebruik 'n vir die breedte, b vir die akkuraatheid, en c as die waarde wat u wil regmaak, terwyl: sou gebruik om 'n vir die breedte en presisie, en b as die waarde aan formaat. Hier is 'n paar voorbeelde daarvan bewus wees dat wanneer die gebruik van 'n eksplisiete indeks, die mag Ontsnapping nodig: As gebruik land (insluitend gebruik land 39: notcharacters39) is in werking en POSIX :: setlocale is genoem, die karakter wat vir die desimaal skeier in geformatteerde swaai-punt getalle is wat geraak word deur die LCNUMERIC land. Sien perllocale en POSIX. Die printf opdrag vreemdeling, dit is 'n baie groot onderwerp wat ondervinding nodig - asseblief ontbrekende inligting in te vul, uit te brei die beskrywings, en korrek is die besonderhede as wat jy kan Aandag: Dit gaan oor die Bash-ingeboude command printf - maar , moet die beskrywing 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. printf en scanf formaat kodes getal met tot ses syfers van gee presisie, wetenskaplike notasie Voetnoot: in printf (), die tipe uitdrukking promosies verwag - in 'n uitdrukking, kar en kort word omgeskakel na int, en float omgeskakel te verdubbel. So c eintlik stem ooreen met 'n parameter van tipe int en f en g eintlik stem ooreen met parameters van tipe dubbel. So in printf () is daar geen verskil tussen f en LF, of tussen g en LG. Maar in scanf () wat geslaag is 'n verwysing na die veranderlike sodat daar geen tipe promosies voorkom of verwag. So f en LF is heel anders in scanf, maar dit is dieselfde in printf. Persoonlik, ek gebruik om LG gereeld gebruik vir dubbelspel in beide printf en scanf, maar dit is uit die guns deesdae en inderdaad gcc sal jy 'n waarskuwing boodskap te gee vir die gebruik van LG in printf. Die gewone prosedure deesdae is om g te gebruik vir dubbel in printf en LG vir dubbel in scanf. Dit maak nie saak wat jy gebruik vir printf omdat die printf biblioteek funksie behandel hulle as sinoniem nie, maar sy noodsaaklik om dit reg te kry vir scanf. printf formaat wysigers Wysigers verskyn tussen die en die sleutel brief. 'n aantal is 'n veld breedte. en 'n aantal is 'n presisie Voorbeeld: printf (6.3f, 2.8) oplewer 2.800 (met 'n spasie voor die 2) Let daarop dat dit 6 sluit die 3 desimale plekke en die 1. - 6 karakters in totaal. So 6-3-1 2 karakters aan die linkerkant van die desimale punt. 0 (die syfer nul) beteken pad met nulle tot veld breedte (gewoonlik net met heelgetalle) l (die brief) beteken lang, bv ld om 'n lang int in desimale Voorbeeld van 0 klaarmaak 2. 3 (. 'n spasie tussen en 3) In 02d, die 0 is nie deel van die wydte veld. Dit is 'n wysiger karakter. En wanneer jy 'n veld breedte, moet jy skryf dit so dat dit nie begin met 'n nul (en dan kan jy prefix 'n nul as 'n wysiger karakter as jy wil dat).There is nie 'n binêre bekering specific in glibc normaalweg. Dit is moontlik om persoonlike sukses tipes voeg tot die printf () familie van funksies in glibc. Sien registerprintffunction vir meer inligting. Jy kan 'n persoonlike b omskakeling voeg vir jou eie gebruik, of dit vergemaklik die aansoek-kode om dit beskikbaar te hê. Hier is 'n voorbeeld van hoe om te implementeer 'n persoonlike printf formate in glibc. Ook, wat you39re praat w. r.t. hantering van verskeie resultate agtermekaar is nie reentrancy per se nie, maar eerder net die gevolge van die gebruik wat neerkom op 'n wêreldwye beswaar teen die uitslag in die winkel. Die funksie word nie weer ingeskryf het. In C die behoorlike, of ten minste baie gebruik, idioom vir die hantering van funksies wat hul resultate in 'n globale voorwerp te slaan is om die resultate onmiddellik kopieer oor hulle te verkry. Dit het die groot voordeel dat as net een gevolg word benodig op 'n tyd toe geen bykomende toewysing nodig is. uitvoering maak Greg A. Woods 27 November 12 by 00:51 Hier we39re gaan hê om te verskil. Ek can39t sien hoe die toevoeging van een onopvallende voorverwerker simbool kom oral in die buurt van die skadelike gevolge van die gebruik gevalle erg beperk, maak die koppelvlak fout sensitiewe, bespreking van permanente stoor vir die duur van die program vir 'n tydelike waarde, en die opwekking erger kode op die meeste moderne platforms . â € R .. 27 November 12 by 01:53 Die familie printf () is net in staat om te druk in die basis 8, 10, en 16 direk met behulp van die standaard spesifiseerders. Stel die skep van 'n funksie wat die getal omskakel na 'n string per kodes spesifieke behoeftes. Alle ander antwoorde tot dusver ten minste een van hierdie beperkings. Gebruik statiese geheue vir die terugkeer buffer. Dit beperk die aantal kere wat die funksie kan as 'n argument gebruik word om printf (). Ken geheue wat die roeping kode vir vrye wysers. Vereis dat die roeping kode uitdruklik voorsien 'n geskikte buffer. Bel printf () direk. Dit verplig 'n nuwe funksie vir om fprintf (). sprintf (). vsprintf (). ens Gebruik 'n beperkte reeks heelgetalle. Die volgende het nie een van die bogenoemde beperking. Dit verg C99 of later en gebruik van e. Dit maak gebruik van 'n saamgestelde letterlike om die buffer spasie voorsien. Dit het geen probleme met verskeie oproepe in 'n printf ().


No comments:

Post a Comment