Convertir Char* a Int en C
-
Utilice la función
strtol
para convertirchar*
aint
en C -
Verifique correctamente los resultados de la función
strtol
para convertirchar*
aint
en C
Este artículo explicará varios métodos de cómo convertir char*
a int en C.
Utilice la función strtol
para convertir char*
a int
en C
La función strtol
es parte de la biblioteca estándar de C, y puede convertir datos char*
en valores enteros largos según lo especificado por el usuario. La función toma 3 argumentos, el primero de los cuales es el puntero donde se encuentra la cadena. Tenga en cuenta que este argumento de puntero char
no se modifica y tiene un calificador const
. El segundo argumento se puede utilizar para almacenar el primer carácter no válido encontrado o la cadena completa en caso de que no se hayan encontrado dígitos. El tercer argumento especifica la base del número a convertir, y el valor de este argumento debe estar entre 2 y 36. El siguiente ejemplo muestra cómo convertir elementos de un array char*
a enteros y enviarlos a la consola.
#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);
}
Producción :
12 | 33 | 43 | 23 | 90 |
Como alternativa, se pueden tomar argumentos de programa como cadenas de entrada y convertirlos en tipos enteros. Tenga en cuenta que necesitamos utilizar int argc, char* argv[]
como los parámetros de la función main
para acceder a los argumentos del programa y procesarlos. El siguiente código de muestra verifica si el usuario proporcionó al menos el único argumento al programa y, si no, sale mostrando el mensaje de error correspondiente.
#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 correctamente los resultados de la función strtol
para convertir char*
a int
en C
Aunque usamos con éxito la llamada strtol
para convertir cadenas pasadas como argumentos de programa a enteros en el ejemplo anterior, existe una gran posibilidad de que el programa dado falle. Se recomienda implementar las rutinas de verificación de errores para la llamada a la función strtol
para garantizar una ejecución robusta del programa con el correspondiente registro de errores. Comprobaremos si el entero convertido está dentro del rango de tipo long
y si la conversión en sí no tuvo éxito. Además, comprobaremos si hay algún carácter después del entero válido y si la entrada dada es un número decimal. Sin embargo, tenga en cuenta que imprimiremos los mensajes de error en la secuencia stderr
en cada caso y no terminaremos el programa, pero debería considerar otra rutina de manejo según sus necesidades.
#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