Túnel do Tempo: a função itoa()
Em uma discussão no fórum de Programação em C e C++ do Viva o Linux, seu proponente perguntava acerca da função itoa(), desejoso de compreender seu funcionamento. Julguei interessante transportá-la, com algumas melhorias, para este espaço, até porque aqui posso fazer algo que não posso fazer naquele fórum, que é dar um exemplo explícito da implementação com código fonte em C.
[ Hits: 17.637 ]
Por: Paulo em 14/06/2017 | Blog: http://unixntools.blogspot.com.br/
#include <errno.h>
#include <limits.h>
#include <stddef.h>
char *my_itoa(int n, char *str, size_t str_size, unsigned short base){
	static const char symbols[36]={
		'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
		'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
		'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
	};
	unsigned abs_n;
	unsigned quot, rem;
	char rev_str[CHAR_BIT*sizeof(int)];
	int rev_str_len=0;
	if(base<2 || base>sizeof symbols){  // Base inválida?
		errno=EINVAL;
		return NULL;
	}
	if(str_size<2){  // String de saída pequena demais?
		errno=ERANGE;
		return NULL;
	}
	if(n<0){  // Trata número negativo (ver nota).
		abs_n=(unsigned)-n;
		*str++='-';
		str_size--;
	}
	else
		abs_n=n;
	do {
		quot=abs_n/base;
		rem=abs_n-quot*base;
		rev_str[rev_str_len++]=symbols[rem];  // Seleciona o algarismo correspondente ao resto.
		if(rev_str_len>str_size-1){  // String de saída pequena demais?
			errno=ERANGE;
			return NULL;
		}
		abs_n=quot;
	} while(quot>0);
	do
		*str++=rev_str[--rev_str_len];  // Copia dígitos da string reversa para a ordem natural na saída.
	while(rev_str_len>0);
	*str='\0';  // Coloca o byte nulo terminador da string de saída.
	return str;
}
[/code]
O modo geral de utilizar a função é o seguinte.
[code]
int number;
char str[10];
unsigned short base;
/* ... Define os valores de 'number' e 'base'... */
if(my_itoa(number, str, sizeof str, base)!=NULL){
  // Conversão bem-sucedida: str contém string com numeral em notação posicional na base 'base'.
}
else{
  // Erro de conversão.  'errno' contém o tipo do erro
}
LivreNFE - O emissor Nfe open source para Linux
Utilizando a biblioteca NCURSES - Parte I
Apreendendo a utilizar o GNU Debugger (parte 2)
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Programa fora de escala na tela do pc (33)
Eu queria adicionar a incon do wifi e deixa transparente no fluxbox no... (0)









