Como converter uma cadeia para inteiro em C?

Estou a tentar descobrir se existe uma forma alternativa de conversão de cordel em inteiro em C.

Eu regularmente padrão o seguinte no meu código.

char s[] = "45";

int num = atoi(s);

Então, há uma maneira melhor ou outra?

Solução

strtol que é melhor IMO. Eu também já tive um gosto em strtonum, então use-o se você o tiver (mas lembre-se que's não é portátil):

long long
     strtonum(const char *nptr, long long minval, long long maxval,
     const char **errstr);

EDIT

Você também pode estar interessado em strtoumax e strtoimax, que são funções padrão no C99. Por exemplo, você poderia dizer:

uintmax_t num = strtoumax(s, NULL, 10);
if (num == UINTMAX_MAX && errno == ERANGE)
    /* Could not convert. */

De qualquer forma, afaste-se do atoi:

A chamada atoi(str) deve ser equivalente a:

(int) strtol(strtol, (char **)NULL, 10)

excepto que o tratamento de erros pode ser diferente. **Se o valor não puder ser representado, o comportamento é indefinido***.

Comentários (7)

Don't utilizar funções do grupo ato.... Estas estão quebradas e são praticamente inúteis. Uma solução moderadamente melhor seria utilizar o sscanf, embora também não seja perfeito.

Para converter string em inteiro, funções do grupo strto... devem ser utilizadas. No seu caso específico, seria a função strtol.

Comentários (3)

Sim, você pode armazenar o inteiro diretamente:

int num = 45;

Se você precisa analisar uma string, atoi ou strol vai ganhar o "menor quantidade de código" concurso.

Comentários (2)