Itoa (C)

Funkce itoa v  programovacím jazyce C vrací poziční zápis zadaného celého čísla s daným základem (např. číslo 10 v základu 7 se zapisuje jako „13“). Tato funkce není definována v žádném standardním jazyce C, ale kompilátory ji často podporují pomocí hlavičky , protože je svým významem velmi blízká funkci standardní knihovny . <stdlib.h>atoi

void* itoa(int input, char *buffer, int radix)

itoapřijme předané celé číslo inputa vrátí jeho reprezentaci v základním číselném systému radix(který musí nabývat hodnot od 2 do 36). Výstupní abeceda se skládá z 36 znaků – nejprve 10 arabských číslic, poté 26 standardních latinských písmen. Výsledné číslo (posloupnost základních číslic radix) se zapíše do výstupní vyrovnávací paměti buffer.

V závislosti na implementaci itoamůže vrátit ukazatel na první znak ve vyrovnávací paměti buffernebo může být zkonstruován tak, aby předal null - buffer, což způsobí, že funkce vrátí délku řetězce, který byl zapsán do správného buffer.

Chcete-li převést číslo na řetězec se základem 8 (osmičková), 10 (desítková) nebo 16 ( hexadecimální ), alternativou vyhovující standardu je použití standardní knihovní funkce sprintf.

Implementace Kernighanem a Ritchiem

Funkce itoase objevila v prvním vydání knihy Brian Kernighan a Denis Ritchie The C Programming Language na straně 60. Druhé vydání The C Programming Language ("K&R2") na straně 64 obsahovalo následující implementaci itoa. Kniha si všímá několika problémů s touto implementací, včetně skutečnosti, že nedokáže správně zpracovat nejmenší záporné číslo  −2 délky strojového slova v bitech-1 . [jeden]

/* itoa: převést n na znaky v s */ void itoa ( int n , char s []) { int i , znamení ; if (( znaménko = n ) < 0 ) /* napište znaménko */ n = - n ; /* udělej z n kladné číslo */ i = 0 _ do { /* generuje čísla v opačném pořadí */ s [ i ++ ] = n % 10 + '0' ; /* získat další číslici */ } while (( n /= 10 ) > 0 ); /* smazat */ if ( znaménko < 0 ) s [ i ++ ] = '-' ; s [ i ] = '\0' ; reverzní ( s ); }

Funkce reverseimplementovaná o dvě stránky dříve:

#include <řetězec.h> /* obráceně: obrácený řetězec s na místě */ void reverzní ( znaků [ ]) { int i , j ; char c ; for ( i = 0 , j = strlen ( s ) -1 ; i < j ; i ++ , j -- ) { c = s [ i ]; s [ i ] = s [ j ]; s [ j ] = c ; } }

Funkce itoa(a podobná funkce ftoa, která převádí čísla s plovoucí desetinnou čárkou na řetězec) je uvedena v první verzi unixového manuálu . [2] Na rozdíl od výše uvedených verzí měla verze knihovny Unix rozhraní podobné

void itoa(int input, void (*subr)(char))

a zavolal rutinu zpětného volání subr pro každý znak ve výstupním řádku, čímž se eliminuje potřeba velké vyrovnávací paměti pro uložení celého řádku najednou.

Viz také

Poznámky

  1. Řešení tohoto problému naleznete v „Řešení K&R2“ Archivováno 3. března 2010 na Wayback Machine na clc-wiki.net .
  2. „Příručka programátora Unix“ Archivováno 18. května 2008. , 3. listopadu 1971. Kapitola "Knihovní rutiny" Archivováno z originálu 9. května 2008. .

Odkazy