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