Myślę, że memcpy udało. Memcopy będzie kopiować bajty i nie tłumaczyć bajtów na znaki (tak jak chcesz). Nie widzisz, ponieważ 534 dzieje się, aby wytworzyć dwa nie drukowalne znaki. Spróbuj użyć 18505 i wydrukuj wiadomość. Nie to, co chcesz. Jeśli itoa nie jest dostępny, zawsze możesz pisać własne. W rzeczywistości jest to powszechny problem w odrabianiu zadań komputerowych. Aby to zrobić, musisz zdobyć każdą cyfrę oddzieloną od liczby całkowitej (podział liczb całkowitych wygłaszania będzie truncate - co chcemy) i będziesz musiał przeliczyć każdą cyfrę z liczby całkowitej od 0 do 9 i jej reprezentacji ascii. To wystarczające wskazówki, ale jeśli potrzebujesz więcej pomocy, możesz się zapytać. Odpowiedz przez Sep 16 10 at 10:08 Jeśli itoa jeśli jest dostępny można go używać, ta funkcja nie jest częścią C, ale jest obsługiwany przez niektórych kompilatorów. Alternatywnie możesz zrobić: odpowiedz 16 września 10 o 9:42 Jest to część standardowej biblioteki CIB tak źle być w każdym zgodnym kompilatorze C lub c. Ndash Mark Sep 16 10 o 9:43 itoa nie jest dostępny ndash Alex Sep 16 10 at 9:44 Mark: Nie, itoa nie jest częścią biblioteki standardowej C. Standardową funkcją tego C jest sprintf (). ndash caf Sep 16 10 at 11:19 Ok I misread niektórych stron man itp. ndash Mark Sep 16 10 at 14:24 Możesz użyć również istringstream: odpowiedzi 16 września 10 w 9:52 1 dla C podejście to działa choć nie jestem pewien. I chociaż używam ostringstream oss oss ltlt field i używam oss. str () zamiast bufora. ndash Tony D Sep 16 10 o 11:46 Twoja metoda nie będzie działać ze względu zarówno na kodowanie znaków, jak i na fakt 9 9. Ale dlaczego nie zbudować własnego Itoa Jest to bardzo proste (wskazówka: x - 0 zmieni się na 0 - 9 na 0 - 9), alternatywnie po prostu skopiuj źródło dla jakiegoś varienta z dowolnego z open source libstdcsC ProgrammingC Referencestdlib. hitoa Funkcja itoa (i nteger do A SCII) jest rozpowszechnionym niestandardowym rozszerzeniem standardowego programowania C język. Nie można go używać przenośnie, ponieważ nie jest zdefiniowany w żadnym ze standardów języka C, jednak kompilatory często dostarczają go przez nagłówek ltstdlib. hgt w trybie niezgodnym, ponieważ jest on logicznym odpowiednikiem standardowej funkcji bibliotecznej atoi. void itoa (int input, bufor char, int radix) itoa pobiera wartość wejściową wartości wejściowej i konwertuje ją na liczbę podstawową. Wynikowa liczba (sekwencja cyfr bazowych) jest zapisywana w wyjściowym buforze buforowym. W zależności od implementacji itoa może zwrócić wskaźnik do pierwszego znaku w buforze. lub może być zaprojektowany w taki sposób, że przekazywanie bufora zerowego powoduje, że funkcja zwraca długość łańcucha, który zostałby zapisany w poprawnym buforze. Aby przekonwertować liczbę na ciąg w bazie 8 (ósemkowy), 10 (dziesiętny) lub 16 (szesnastkowy), alternatywą zgodną z Standardem jest użycie standardowej funkcji bibliotecznej sprintf. Funkcja itoa pojawiła się w pierwszej edycji Kernighan i Ritchies The C Programming Language. na stronie 60. Drugie wydanie The C Programming Language (KampR2) zawiera następującą implementację itoa. na stronie 64, w wersjach hiszpańskich, przejdź do strony 47. Książka zawiera kilka kwestii związanych z tą implementacją, w tym fakt, że nie obsługuje ona najbardziej negatywnej liczby 2 wordsize-1. 1 Funkcja odwrotna użyta powyżej jest zaimplementowana wcześniej dwie strony: funkcja itoa (i podobna funkcja, ftoa, która przekształciła float na ciąg znaków) została wymieniona w podręczniku systemu Unix pierwszego wydania. 2 W przeciwieństwie do wersji podanych powyżej, wersja biblioteki Unix miała interfejs mniej więcej równoważny pustej itoa (int input, void (subr) (char)) i wywoływałaby podprogram rutyny zwrotnej na każdym znaku w łańcuchu wyjściowym, eliminując w ten sposób potrzebę dla bufora wystarczająco dużego, aby pomieścić cały ciąg. implementacje itoa () z testami wydajności leksykograf - alternatywa C, część bibliotek boost modpnumtoa - alternatywa CC do konwersji liczb całkowitych i zmiennych do buforów char. Dobra stara konwersja Integer To Ascii: itoa - kolejna szybka implementacja itoa dla różnych typów danych, a także kilka zawijanych stylów zawijania w postaci szablonów boost :: lexicalcast. Achecheology itoa to niestandardowa funkcja pomocnicza zaprojektowana w celu uzupełnienia standardu atoi funkcja i prawdopodobnie ukrywanie sprintf (większość jego funkcji może być zaimplementowana pod względem sprintf): cplusplusreferenceclibrarycstdlibitoa. html Użyj sprintf. Lub snprintf. Lub niezależnie od narzędzia. Pomimo faktu, że niektóre funkcje nie są w standardzie, to słusznie wspomniane przez jeden z jego komentarzy, większość kompilatorów oferuje alternatywę (np. Visual C posiada własne snprintf, które można wpisać do snprintf, jeśli jest potrzebna). Droga C. Użyj strumieni C (w bieżącym przypadku std :: stringstream (lub nawet przestarzałego std :: strstream, jak zaproponował Herb Sutter w jednej z jego książek, ponieważ jest nieco szybszy). Wnioski Jesteś w C, co oznacza, że możesz wybierz sposób, w jaki chcesz: szybszy sposób (np. sposób C), ale powinieneś być pewien, że kod jest wąskim gardłem w twojej aplikacji (przedwczesne optymalizacje są złe, itp.) i że twój kod jest bezpiecznie zamknięty, aby uniknąć ryzykowania bufora Bezpieczniejsza droga (tj. droga C), jeśli znasz tę część kodu, nie jest krytyczna, więc lepiej być pewien, że ta część kodu nie zostanie przerwana w losowych momentach, ponieważ ktoś pomylił się o rozmiarze lub wskaźniku (co się dzieje w Chris Kaminski: Jeśli studiujesz interfejs c strumienia, zrozumiesz, dlaczego są wolniejsze, nawet jeśli wyjdziesz prosto integer: W C używasz własnego buforu, prawdopodobnie przydzielonego w sta ck, podczas gdy w C, stringstream będzie używać własnych. W C możesz ponownie użyć swojego bufora. W języku C należy wyodrębnić ciąg z ciągu łańcuchowego, który jest std :: string copy. ndash paercebal 31 maja w godz. 9:10 fuzzyTew: 1 W moim artykule mówiłem o sprintf i jego bezpiecznych wariantach, nie tylko sprintfie. 2 Znajomość skompilowanego kodu nie jest zadaniem niemożliwym (w moim przypadku, w najgorszym przypadku, WindowsVC, SolarisCC i Linuxg, w najlepszym przypadku, tylko WindowsVC). 3 Opisujesz świat, w którym sabotażyści próbujący złamać twój kod są normą. Mój świat składa się z normalnych programistów, więc tracąc czas, starając się chronić mój kod od sabotażystów, przepisując moją moją quotsecurequot wersję każdego API nie jest wydajna. . ndash paercebal wrz 8 11 at 11:06 fuzzyTew :. Wnioski Użyj najlepszego narzędzia pod ręką. A jeśli najlepszym narzędziem jest sprintf ukryty w klasie lub funkcji opakowania. Teraz, jeśli jesteś zwolennikiem przepisywania sprintf jako odpowiedzi na to pytanie, możesz napisać własną odpowiedź. Nie jestem pewien, czy autor kwestionuje wszystkie komentarze. ndash Paercebal Sep 8 11 at 11:07 Napisałem tę funkcję wątku bezpiecznie jakiś czas temu i jestem bardzo szczęśliwy z wyników i uważam algorytm jest lekki i chudy, z wydajnością, która jest około 3x standardową MSVC itoa () funkcji. To łącze. Optymalna Base-10 tylko funkcja itoa () Wydajność jest co najmniej 10 razy większa od sprintf (). Test porównawczy jest również testem jakości QA w następujący sposób. Pojawiły się pewne głupie sugestie dotyczące korzystania z pamięci wywołującej, która pozostawiłaby wynik pływający gdzieś w buforze w przestrzeni adresowej rozmówcy. Ignoruj ich. Kod I wymienione działa doskonale, jak dowodzi benchmarkQA kod. Uważam, że ten kod jest na tyle na tyle używany w osadzonym środowisku. Oczywiście YMMV. odpowiedziało 1 lipca 14 o 7:54 2017 Stack Exchange, Inc
No comments:
Post a Comment