Disassembler

Artificial intelligence is no match for natural stupidity.
18října2011

Integer to ASCII (itoa) v ANSI C


Kolega se učí programovat v C/C++. Je začátečník, takže většina jeho programování probíhá zpětným inženýrstvím - tedy vykopírováním cizího kódu, pokusem o podrobné pochopení jeho funkce a následnou modifikací k obrazu svému metodou pokus-omyl. Dnes se dostal k převodům mezi číselnými soustavami. Chvíli se plácal v editoru až nakonec vytvořil třicetiřádkovou obludu se čtyřmi různými cykly. To vše jen na převod z desítkové do dvojkové soustavy.

Příliš lehké GCC


Trochu jsem mu tedy jeho kód učesal a pak nastartoval svoje Visual Studio a ukázal mu kouzlo třetího parametru itoa() funkce. Ten totiž určuje radix - tedy číselnou soustavu, ve které bude výsledek. Když ovšem můj kód spustil na svém Ubuntu, gcc mu oznámilo undefined reference to ‚itoa‘. Ve svém stdlib.h jednoduše žádnou takovou funkci neměl. Kolo se mi znovu vynalézat nechtělo, tam jsem po chvíli googlení objevil hezkou čistou ANSI C implementaci.

/**
 * ANSI C "itoa" based on Kernighan & Ritchie's "ANSI C":
 */

void strreverse(char* begin, char* end)
{
    char aux;
    while(end > begin)
        aux = *end, *end-- = *begin, *begin++ = aux;
}
	
void itoa(int value, char* str, int base)
{
    static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    char* wstr = str;
    int sign;

    // Validate base
    if (base < 2 || base > 35)
    {
        *wstr = '\0';
        return;
    }

    // Take care of sign
    if ((sign = value) < 0)
        value = -value;

    // Conversion. Number is reversed.
    do
        *wstr++ = num[value % base];
    while(value /= base);
    if (sign < 0)
        *wstr++ = '-';
    *wstr = '\0';

    // Reverse string
    strreverse(str, wstr-1);
}

Zdroj: http://www.jb.man.ac.uk/~slowe/cpp/itoa.html