No es tan difícil manejar la matriz de caracteres sin convertir la matriz en una cadena. Especialmente en el caso en que la longitud de la matriz de caracteres se conoce o se puede encontrar fácilmente. Con el arreglo de caracteres, la longitud debe ser determinado en el mismo alcance que la definición de matriz, por ejemplo .:
size_t len sizeof myarray/sizeof *myarray;
Para las cadenas que, por supuesto, tiene strlen
disponible.
Con la longitud conocida, independientemente de si se trata de una matriz de caracteres o una cadena, puede convertir los valores de caracteres a un número con una función corta similar al siguiente:
/* convert character array to integer */
int char2int (char *array, size_t n)
{
int number = 0;
int mult = 1;
n = (int)n < 0 ? -n : n; /* quick absolute value check */
/* for each character in array */
while (n--)
{
/* if not digit or '-', check if number > 0, break or continue */
if ((array[n] < '0' || array[n] > '9') && array[n] != '-') {
if (number)
break;
else
continue;
}
if (array[n] == '-') { /* if '-' if number, negate, break */
if (number) {
number = -number;
break;
}
}
else { /* convert digit to numeric value */
number += (array[n] - '0') * mult;
mult *= 10;
}
}
return number;
}
Por encima es simplemente el enfoque de conversión estándar de char a int con algunos condicionales adicionales incluidos. Para manejar caracteres extraviados, además de digits
y '-'
, el único truco es tomar decisiones inteligentes sobre cuándo comenzar a recopilar dígitos y cuándo detenerse.
Si se inicia la recogida de digits
para la conversión cuando se encuentra con el primer digit
, a continuación, la conversión termina cuando se encuentra con el primer '-'
o non-digit
. Esto hace que la conversión sea mucho más conveniente cuando está interesado en índices tales como (por ejemplo, file_0127.txt
).
Un breve ejemplo de su uso:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int char2int (char *array, size_t n);
int main (void) {
char myarray[4] = {'-','1','2','3'};
char *string = "some-goofy-string-with-123-inside";
char *fname = "file-0123.txt";
size_t mlen = sizeof myarray/sizeof *myarray;
size_t slen = strlen (string);
size_t flen = strlen (fname);
printf ("\n myarray[4] = {'-','1','2','3'};\n\n");
printf (" char2int (myarray, mlen): %d\n\n", char2int (myarray, mlen));
printf (" string = \"some-goofy-string-with-123-inside\";\n\n");
printf (" char2int (string, slen) : %d\n\n", char2int (string, slen));
printf (" fname = \"file-0123.txt\";\n\n");
printf (" char2int (fname, flen) : %d\n\n", char2int (fname, flen));
return 0;
}
Nota: cuando se enfrentan a '-'
índices de los archivos delimitados (o similares), que depende de usted para negar el resultado. (por ejemplo, file-0123.txt
comparado con donde el primero devolvería -123
mientras que el segundo 123
).
Ejemplo de salida
$ ./bin/atoic_array
myarray[4] = {'-','1','2','3'};
char2int (myarray, mlen): -123
string = "some-goofy-string-with-123-inside";
char2int (string, slen) : -123
fname = "file-0123.txt";
char2int (fname, flen) : -123
Nota: siempre hay casos de esquina, etc., que pueden causar problemas. Esto no pretende ser 100% a prueba de balas en todos los juegos de caracteres, etc., sino que trabaja una abrumadora mayoría de las veces y proporciona flexibilidad de conversión adicional sin el análisis inicial o la conversión a cadena requerida por atoi
o strtol
, etc.
1. te falta '4' 2. ¿tienes un terminador nulo para la matriz? – MByD
¿Existe la posibilidad de agregar un '' \ 0'' adicional al final de la matriz? Entonces estaríamos listos en poco tiempo. –
Eso es porque no hay ninguno. Sin embargo, hay formas para cadenas terminadas en nulos. 'atoi' y' strtol' son dos opciones. 'char myarray [] = {'-', '1', '2', '3', '4', 0}; int i = atoi (myarray); ' – falstro