Jeg tror memcpyen har lyktes. Memcopy skal kopiere bytes og ikke oversette bytes til tegn (som du vil gjøre). Du kan ikke se fordi 534 skjer for å produsere to ikke-skrivbare tegn. Prøv å bruke 18505 og det vil skrive ut en melding. Ikke hva du vil skjønt. Hvis det ikke er tilgjengelig så kan du alltid skrive din egen. Faktisk det er et vanlig datalogi-problem med datavitenskap. For å gjøre det må du få hvert tall som er skilt fra heltalet (hint-integer-avdelingen vil avkorte - akkurat det vi vil), og du må konvertere hvert siffer fra et helt tall mellom 0 og 9 og dets ascii-representasjon. Det er nok hint, men hvis du trenger mer hjelp, vær så snill å spørre. besvart 16 september 10 kl 10:08 Hvis det er tilgjengelig, kan du bruke det, denne funksjonen er ikke en del av C, men støttes av noen kompilatorer. Alternativt kan du gjøre: Besvart 16 september 10 kl 9:42 Det er en del av C standard lib så dårlig være i noen samsvarende C eller C compiler ndash Mark Sep 16 10 kl 9:43 itoa er ikke tilgjengelig ndash Alex Sep 16 10 på 9:44 Merk: Nei, det er ikke en del av C-standardbiblioteket. C-standardfunksjonen for å gjøre dette er sprintf (). ndash caf Sep 16 10 kl 11:19 Ok Jeg har misforstått noen av mannens sider osv. ndash Mark Sep 16 10 kl 14:24 Du kan også bruke istringstream: svarte Sep 16 10 kl 9:52 1 for en C-tilnærming Fungerer det egentlig? selv om jeg ikke er sikker. Jeg bruker selv om vi bruker oss oss ltlt-feltet og bruker oss. str () i stedet for en buffer. ndash Tony D Sep 16 10 kl 11:46 Metoden din går ikke på jobb på grunn av både koding av tegn og faktum 9 9. Men hvorfor ikke bare bygg din egen itoa Det er veldig enkelt (hint: x - 0 blir 0 - 9 til 0 - 9), alternativt bare kopi kilden for en variabel fra en hvilken som helst av åpen kildekode libstdcsC ProgrammeringC Referencestdlib. hitoa Det er en funksjon for en SCII-funksjon som er en utbredt ikke-standardutvidelse til standard C-programmeringen Språk. Det kan ikke brukes portabelt, da det ikke er definert i noen av C-språkstandardene, gir kompilatorer det ofte gjennom overskriften ltstdlib. hgt mens de er i samsvar med modusen, fordi det er en logisk motsetning til standardbibliotekets funksjon atoi. void itoa (int input, char buffer, int radix) itoa tar integer inngangsverdien input og konverterer den til et nummer i base radix. Det resulterende tallet (en sekvens av base radix siffer) skrives til utgangsbuffertbufferen. Avhengig av implementeringen, kan det returnere en peker til det første tegnet i buffer. eller kan være utformet slik at passering av nullbuffer forårsaker at funksjonen returnerer lengden på strengen som ville vært skrevet inn i en gyldig buffer. For å konvertere et tall til en streng i base 8 (oktal), 10 (desimal) eller 16 (heksadesimal), er et Standard-kompatibelt alternativ å bruke standardbiblioteksfunksjonen sprintf. Funksjonen det ble vist i den første utgaven av Kernighan og Ritchies The C Programming Language. på side 60. Den andre utgaven av C-programmeringsspråket (KampR2) inneholder følgende implementering av itoa. på side 64 for spanske utgaver, gå til side 47. Boken noterer seg flere problemer med denne implementeringen, inkludert det faktum at den ikke håndterer det mest negative nummer 2 ordtekst-1. 1 Funksjonen omvendt brukt ovenfor er implementert to sider tidligere: En itoa-funksjon (og en lignende funksjon, ftoa som konverterte en flyt til en streng) ble oppført i første utgave av Unix-håndboken. 2 I motsetning til versjoner som er gitt ovenfor, hadde Unix-biblioteket et grensesnitt omtrent omtrentlig som ugyldig (int input, void (subr) (char)) og ville påkalle tilbakeringingsrutin-subr på hvert tegn i utgangsstrengen, og dermed eliminere behovet for en buffer som er stor nok til å holde hele strengen. itoa () implementeringer med ytelse tester lexicalcast - C alternativ, en del av boost biblioteker modpnumtoa - CC alternativ for å konvertere heltall og flyter til char buffere. God gammel integer til Ascii-konvertering: itoa - En annen rask implementering av itoa for ulike datatyper, pluss noen boost-stil-innpakning i form av boost :: lexicalcast-malpesializations. Archeology itoa var en ikke-standard hjelperfunksjon designet for å utfylle atoi-standarden funksjon, og sannsynligvis gjemmer en sprintf (De fleste dens funksjoner kan implementeres i form av sprintf): cplusplusreferenceclibrarycstdlibitoa. html Bruk sprintf. Eller snprintf. Eller hvilket verktøy du finner. Til tross for at enkelte funksjoner ikke er i standarden, vil det som sagt omtalt av onebyone i en av sine kommentarer, de fleste kompilatorer tilby deg et alternativ (for eksempel Visual C har sin egen snprintf du kan skrive til snprintf hvis du trenger det). C-veien. Bruk C-strømmene (i den nåværende saken std :: stringstream (eller til og med den avvikte std :: strstream, som foreslått av Herb Sutter i en av hans bøker, fordi det er noe raskere). Konklusjon Youre in C, som betyr at du kan velg hvordan du vil ha det: Den raskere måten (dvs. C-veien), men du bør være sikker på at koden er en flaskehals i søknaden din (for tidlig optimeringer er onde osv.), og at koden din er trygt innkapslet for å unngå å risikere buffer Overganger. Den sikrere måten (dvs. C-veien), hvis du vet denne delen av koden, er ikke kritisk, så vær sikker på at denne delen av koden ikke vil gå i tilfeldige øyeblikk fordi noen mistet en størrelse eller en peker (som skjer i virkelige liv, som i går, på datamaskinen min fordi noen trodde det var kult å bruke den raskere måten uten at det virkelig trengte det.) Chris Kaminski: Hvis du studerer c stream39s grensesnitt, forstår du hvorfor de er tregere, selv når du skriver ut en enkel heltall: I C bruker du din egen buffer, eventuelt tildelt i staven ck, mens i C vil strengstrømmen bruke sin egen. I C kan du da bruke bufferen igjen. I C må du trekke ut strengen fra strengen, som er en std :: strengkopi. ndash paercebal 31 mai 10 kl 9:10 fuzzyTew: 1 I mitt innlegg snakket jeg om sprintf og dets sikre varianter, ikke bare sprintf. 2 Å vite hvor koden din er samlet er ikke en umulig oppgave (i verste fall, WindowsVC, SolarisCC og Linuxg, i beste fall, bare WindowsVC). 3 Du beskriver en verden der sabotører prøver å krasje koden din er normen. Min verden er sammensatt av normale utviklere, så det å miste tid på å prøve å beskytte min kode fra sabotører ved å skrive om min quotsecurequot-versjon av hver API er ikke produktiv. . ndash paercebal 8 sep 11 kl 11:06 fuzzyTew:. Konklusjon Bruk det beste verktøyet for hånden. Og hvis det beste verktøyet er et sprintf skjult inne i en wrapper-klasse eller - funksjon. Nå, hvis du fortaler for omskrivning av sprintf som svar på dette spørsmålet, vær så snill å skrive ditt eget svar. Jeg er ikke sikker på at spørsmålet forfatteren leser alle kommentarene. ndash paercebal Sep 8 11 på 11:07 Jeg skrev denne trådbeskyttede funksjonen for en tid siden, og jeg er veldig fornøyd med resultatene og føler algoritmen er lett og mager, med ytelse som er om 3 x standard MSVC itoa () - funksjonen. Heres lenken. Optimal Base-10 only itoa () - funksjonen Ytelsen er minst 10X den for sprintf (). Referansen er også funksjonens QA-test, som følger. Det er noen dumme forslag gjort om å bruke oppringerens lagringsplass som ville la resultatet flyte et sted i en buffer i oppringers adresseplass. Ignorer dem. Koden jeg oppførte, fungerer perfekt, som benchmarkQA-koden demonstrerer. Jeg tror at denne koden er liten nok til å bruke i et innebygd miljø. YMMV, selvfølgelig. besvart 1 juli kl 14:54 2017 Stack Exchange, Inc
No comments:
Post a Comment