Converter Char * para Int em C
-
Use a função
strtol
para converterchar*
emint
em C -
Verifique corretamente os resultados da função
strtol
para converterchar*
emint
em C
Este artigo explicará vários métodos de como converter char*
em int em C.
Use a função strtol
para converter char*
em int
em C
A função strtol
é parte da biblioteca padrão C e pode converter dados char*
em um valor inteiro longo conforme especificado pelo usuário. A função leva 3 argumentos, o primeiro dos quais é o ponteiro onde a string está localizada. Observe que este argumento de ponteiro char
não é modificado e possui um qualificador const
. O segundo argumento pode ser utilizado para armazenar o primeiro caractere inválido encontrado ou toda a string no caso de não haver dígitos encontrados. O terceiro argumento especifica a base do número a ser convertido e o valor desse argumento deve estar entre 2 e 36. O exemplo a seguir mostra como converter elementos de un array char*
em inteiros e gerá-los no console.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printIntegers(long int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
char *arr[] = {"12", "33", "43", "23", "90"};
size_t len = sizeof arr / sizeof arr[0];
long int arr3[len];
for (int i = 0; i < len; ++i) {
arr3[i] = strtol(arr[i], NULL, 10);
}
printIntegers(arr3, len);
exit(EXIT_SUCCESS);
}
Resultado:
12 | 33 | 43 | 23 | 90 |
Como alternativa, pode-se pegar os argumentos do programa como strings de entrada e convertê-los em tipos inteiros. Observe que precisamos usar int argc, char* argv[]
como os parâmetros da função main
para acessar os argumentos do programa e processá-los. O próximo código de amostra verifica se o usuário forneceu pelo menos um único argumento para o programa e, se não, sai exibindo a mensagem de erro correspondente.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printIntegers(long int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
exit(EXIT_FAILURE);
}
long int arr2[argc - 1];
for (int i = 0; i < argc - 1; ++i) {
arr2[i] = strtol(argv[i + 1], NULL, 10);
}
printIntegers(arr2, argc - 1);
exit(EXIT_SUCCESS);
}
Verifique corretamente os resultados da função strtol
para converter char*
em int
em C
Embora tenhamos usado com sucesso a chamada strtol
para converter strings passadas como argumentos de programa para inteiros no exemplo anterior, há uma grande chance de que o programa fornecido falhe. Recomenda-se implementar as rotinas de verificação de erros para a chamada da função strtol
para garantir uma execução robusta do programa com o registro de erros correspondente. Verificaremos se o inteiro convertido está dentro do intervalo do tipo long
e se a conversão em si não foi bem-sucedida. Além disso, verificaremos se há algum caractere após o inteiro válido e se a entrada fornecida é um número decimal. Porém, lembre-se de que imprimiremos as mensagens de erro no fluxo stderr
em cada caso e não encerraremos o programa, mas você deve considerar outra rotina de tratamento com base em suas necessidades.
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printIntegers(long int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
exit(EXIT_FAILURE);
}
long int num;
char *endptr, *str = argv[1];
errno = 0;
long ret = strtol(str, &endptr, 10);
if (str == endptr) {
fprintf(stderr, "%s: not a decimal number\n", str);
} else if ('\0' != *endptr) {
fprintf(stderr, "%s: extra characters at end of input: %s\n", str, endptr);
} else if ((LONG_MIN == ret || LONG_MAX == ret) && ERANGE == errno) {
fprintf(stderr, "%s out of range of type long\n", str);
} else if (errno != 0 && ret == 0) {
fprintf(stderr, "%s no conversion was performed\n", str);
} else {
num = ret;
printf("num: %ld\n", num);
}
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook