11 dezembro 2019

42 - ft_atoi

Vamos para o enunciado:
  • Escreva uma função que converta o início da cadeia apontada por str em inteiro do tipo int
  • str pode começar por um número arbitrário de ’white space’ (como definido por isspace(3))
  • str pode então ser seguido por um número arbitrário de sinais + e sinais -. O sinal - vai mudar o sinal do inteiro retornado em função do número de sinais - e se este for par ou ímpar.
  • Por fim, str deverá ser composta por número da base 10
  • Sua função deverá ler str desde que esta siga as regras acima e ela deve retornar o número encontrado até então.
  • Você não deve considerar os overflows e os underflows, o resultado é considerado indefinido nesses casos.
  • Você pode comparar sua função com a verdadeira função atoi, exceto a parte dos sinais bem como do overflow.
Veja um exemplo de um programa que mostra o valor de retorno de atoi:  $>./a.out "           ---+--+1234ab567"
-1234

Ela deverá ser prototipada da seguinte maneira:
int ft_atoi(char *str)


 A função atoi (alpha to intenger) original faz como o nome sugere, transforma uma string em um int. A ft_atoi é como o atoi com regras de sinais -u- 

Vamos ao código por partes. Primeiro criei uma função para verificar se um caracter é um espaço, já que a função deve ignora-los. A função is_space ficou:
int is_space(char c){
 if (c == ' ' || c == '\t' || c == '\n' ||\ c == '\v' || c == '\f' || c == '\r') return (1);
return (0);
}

É importante ressaltar que além do ' ' há outras formas de indicar espaço como o '\n' e o '\v', para saber mais consulte man 3 isspace.

Agora as próximas funções, uma foi criada para verificar se um caracter é um operador (+ ou -) e a outra para verificar se é um número (0 à 9). Ficaram assim:
int is_operator(char c){
if (c == '+' || c == '-') return (1);
return (0);
}

int is_number(char c){
if (c >= '0' && c <= '9') return (1);
return (0);
}
E por fim chegamos no ft_atoi, que ficou assim:
int ft_atoi(char *str)
{
int total;  //criamos uma variável do tipo int para guardar o total
int sign; //criamos uma váriavel do tipo int para indicar o sinal 1 e -1
total = 0;
sign = 1; //começa positivo
while (is_space(*str)) //avança os espaços
str++;

while (is_operator(*str)) //enquanto encontrar operadores
{
if (*str == '-') //se for o sinal '-' muda o sinal (multiplica por -1)
sign *= -1;
str++; //senão (se for '+') só avança
}

while (is_number(*str)) //enquanto for número
{
total *= 10; //multiplica por 10 por conta da dezena, centena... Para organizar a posição da unidade
total += *str - '0'; //tira '0' para transformar de char para int
str++;
}
return (total * sign); //se o sinal estiver valendo -1, o resultado será negativo
}





Nenhum comentário:

Postar um comentário

GNMH - CRÉDITOS ❤