A versão de
itoa() que aparece no código mostrado pelo nosso amigo se parece com a implementação que havia nos antigos compiladores da Borland para o MS-DOS, tais como o Turbo C e seus sucessores. Ela converte um número inteiro para strings de caracteres, contendo os algarismos usados para representar o número de acordo com uma base de numeração informada, a qual podia variar de 2 a 36. Para bases
N entre 2 e 10, os algarismos usados eram os primeiros
N algarismos do conjunto {'0', '1', '2', ... '9'}. Para bases entre 11 a 36, as letras maiúsculas do ASCII eram usadas também como algarismos, com 'A' valendo 11, 'B' valendo 12, e assim por diante, até 'Z' valendo 35.
Mas a implementação da Borland tinha alguns problemas. Entre eles, destacam-se os seguintes:
- Não fazer parte da biblioteca de funções padronizadas do C. Isso limitava seu uso apenas a compiladores da Borland e a algumas outras variações que se esforçavam para ser compatíveis com ele, principalmente no mundo MS-DOS. No Linux e nos Unixes em geral, bem como em várias implementações de compiladores C para Windows, essa função não é reconhecida.
- A função não detectava nem sinalizava erros, tais como valor inválido da base ou ponteiro inválido para a string de saída.
- Como caso particular de falta de detecção de erros, e com impacto de segurança, está o fato de que a função não permitia reconhecer se a string informada tinha espaço suficiente para acomodar a conversão do número. A documentação da função até dizia que o programador deveria se certificar disso, mas a própria função não tinha como fazer qualquer verificação que garantisse esse cuidado.
Note que, ao executar o programa mostrado pelo nosso colega que fez a pergunta, se o usuário digitar um número maior que ou igual a 512, o programa vai dar problema, pois a conversão vai extrapolar o tamanho do array de caracteres
binário, que foi declarado com apenas dez elementos.
A função da biblioteca padrão do C mais indicada para converter números para strings é
snprintf(). No caso de números inteiros, a conversão pode ser feita para representações do número em base decimal, octal ou hexadecimal, através das conversões
"%d",
"%o" e
"%x", respectivamente.
Infelizmente, porém, as funções da família de
printf() não produzem saída em base binária nem, de modo mais geral, numa outra base qualquer (sujeita a limites mínimo e máximo), como a
itoa() do Turbo C permitia fazer. Curiosamente, a função padronizada
strtol(), que faz a operação inversa de conversão de string para inteiro, aceita como base de representação um valor qualquer na faixa de 2 a 36, que são os mesmos limites de itoa(), e strings de entrada formadas pelos mesmos caracteres que itoa() teria produzido como saída.