Este escrito ha sido aprobado por especialistas para asegurar la veracidad de nuestra esta noticia.
Solución:
Personalmente no me gusta atoi
función. Yo sugeriría sscanf
:
char myarray[5] = '-', '1', '2', '3', ' ';
int i;
sscanf(myarray, "%d", &i);
Es muy estándar, está en el stdio.h
Biblioteca 🙂
Y en mi opinión, te permite mucha más libertad que atoi
, formato arbitrario de su número-string, y probablemente también permita caracteres no numéricos al final.
EDITAR
Acabo de encontrar esta maravillosa pregunta aquí en el sitio que explica y compara 3 formas diferentes de hacerlo: atoi
, sscanf
y strtol
. Además, hay una buena información más detallada sobre sscanf
(en realidad, toda la familia de *scanf
funciones).
EDIT2
Parece que no solo a mí personalmente me disgusta el atoi
función. Aquí hay un enlace a una respuesta que explica que el atoi
La función está obsoleta y no debe usarse en un código más nuevo.
¿Por qué no usar simplemente atoi? Por ejemplo:
char myarray[4] = '-','1','2','3';
int i = atoi(myarray);
printf("%dn", i);
Me da, como esperaba:
-123
Actualización: por qué no – el personaje array no es null terminado. Doh!
No es tan difícil lidiar con el personaje. array sí mismo sin convertir el array a un string. Especialmente en el caso donde la longitud del carácter array se conoce o se puede encontrar fácilmente. Con el personaje array, la longitud debe determinarse en el mismo ámbito que el array definición, por ejemplo:
size_t len sizeof myarray/sizeof *myarray;
Para cuerdas, por supuesto, tienes strlen
disponible.
Con la longitud conocida, sin importar si se trata de un personaje array o un string, puede convertir los valores de los caracteres en un número con una función corta similar a la 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--)
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;
Lo anterior es simplemente el enfoque de conversión estándar de char a int con algunos condicionales adicionales incluidos. Para manejar personajes extraviados, además del digits
y '-'
, el único truco es tomar decisiones inteligentes sobre cuándo comenzar a recopilar dígitos y cuándo detenerse.
Si empiezas a coleccionar digits
para la conversión cuando encuentre el primer digit
, la conversión finaliza cuando se encuentra el primer '-'
o non-digit
. Esto hace que la conversión sea mucho más conveniente cuando está interesado en índices como (p. Ej. file_0127.txt
).
Un breve ejemplo de su uso:
#include
#include
#include
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';nn");
printf (" char2int (myarray, mlen): %dnn", char2int (myarray, mlen));
printf (" string = "some-goofy-string-with-123-inside";nn");
printf (" char2int (string, slen) : %dnn", char2int (string, slen));
printf (" fname = "file-0123.txt";nn");
printf (" char2int (fname, flen) : %dnn", char2int (fname, flen));
return 0;
Nota: cuando se enfrenta a '-'
índices de archivos delimitados (o similares), depende de usted negar el resultado. (p.ej file-0123.txt
en comparación con file_0123.txt
donde volvería el primero -123
mientras que el segundo 123
).
Salida de ejemplo
$ ./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 conjuntos de caracteres, etc., sino que funciona la mayoría de las veces y proporciona una flexibilidad de conversión adicional sin el análisis inicial o la conversión a string Requerido por atoi
o strtol
etc.
Si piensas que ha resultado provechoso este post, sería de mucha ayuda si lo compartes con el resto entusiastas de la programación de esta manera nos ayudas a dar difusión a nuestra información.