ft_atoi

A função atoi() converte uma string para um inteiro (int).

Declaração

int atoi(const char *str);

Parâmetros

  • str – A string representando o número.

Retorno

Essa função retorna o número convertido para int. Se a conversão não puder ser feita, retorna 0.

Números negativos são aceitos. O sinal de ‘+’ também, +742 ficaria 742.

Exemplo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {
   int val;
   char str[20];
   
   strcpy(str, "98993489");
   val = atoi(str);
   printf("Valor da string = %s, Valor do int = %d\n", str, val);

   strcpy(str, "kpop");
   val = atoi(str);
   printf("Valor da string = %s, Valor do int = %d\n", str, val);

   return(0);
}

Saída:

Valor da string = 98993489, Valor do int = 98993489
Valor da string = kpop, Valor do int = 0

Codificando a função

Se a string começar com espaços é necessário avançar até encontrarmos um sinal ou número, se um sinal de negativo for encontrado significa que o resultado final será multiplicado por -1. Enquanto contiver números na string devemos multiplicar o total por 10 (por conta das casas decimais – dezena, centena, milhar…) e somar ao total a string menos ‘0’ (transformar para número, olhar a tabela ASCII para mais detalhes).

int	ft_atoi(const char *str)
{
	long	total;
	int	sign;

	total = 0;
	sign = 1;
        //enquanto for espaço (ver man isspace() para mais detalhes)
	while (*str == ' ' || *str == '\t' || *str == '\n' ||\
			*str == '\v' || *str == '\f' || *str == '\r')
		str++;
	if (*str == '-')
	{
		sign *= -1; //se encontrar o '-', o sinal fica negativo
		str++;
	}
	else if (*str == '+')
		str++; //se encontrar o '+' só avança
	while (*str >= '0' && *str <= '9')
	{
		total *= 10; //arrumando as casas decimais
		total += *str - '0'; //transformando para número
		str++;
	}
	return (total * sign);
}

Outra solução, caso tenha implementado outras funções:

int	ft_atoi(const char *str)
{
	long	total;
	int     sign;

	total = 0;
	sign = 1;
	while (ft_isspace(*str)) //enquanto for espaço
		str++;
	if (ft_isoperator(*str)) //se for '+' ou '-'
	{
                if (*str == '-')
		      sign *= -1;
		str++;
	}
	while (ft_isdigit(*str)) //enquanto for número
	{
		total *= 10;
		total += *str - '0';
		str++;
	}
	return (total * sign);
}

Referências

http://man7.org/linux/man-pages/man3/atoi.3.html

https://www.tutorialspoint.com/c_standard_library/c_function_atoi.htm

Deixe um comentário