2012-04-15 20 views
9

¿Por qué esta distinción? He tenido problemas terribles, asumiendo que itoa estaba en stdlib.h y finalmente terminaba vinculando una versión personalizada de itoa con un prototipo diferente y produciendo algunos errores graves.atoi es una función estándar. Pero itoa no lo es. ¿Por qué?

Entonces, ¿por qué no es itoa una función no estándar? ¿Qué pasa con eso? ¿Y por qué es el estándar parcial hacia su hermano gemelo atoi?

+11

'atoi' es histórico,' itoa' no lo es. Realmente no deberías usar 'atoi' de todos modos,' strto (u) l (l) 'es lo que deberías usar. Para la otra dirección, 's (n) printf'. –

+0

Como 'itoa' no es una función estándar, ¿puede incluir lo que debe ser el contrato de interfaz para la función' itoa' que desea discutir?(Esto puede responder a su pregunta.) –

+0

@CharlesBailey Tengo curiosidad en general sobre por qué el estándar incluye atoi y no itoa –

Respuesta

7

No itoa ha sido alguna vez estandarizado, por lo que para agregarlo al estándar necesitaría un motivo convincente y una buena interfaz para agregarlo.

mayoría itoa interfaces que he visto o bien usa un buffer estático que tiene problemas de re-entrada y de por vida, asignar un búfer dinámico que la persona que llama tiene que liberar o requerir al usuario que proporcione un tampón que hace que la interfaz no es mejor que sprintf.

+2

itoa() con un búfer pasado puede ser una gran victoria sobre s (n) printf() cuando no se usa nada más de esa parte particular de la biblioteca (nada en la familia printf()). Esa no es una razón para poner itoa() en la biblioteca C estándar, pero es una razón para preferirla a algo mucho más pesado. –

+0

@JulieinAustin: ¿Por qué es una gran victoria? Es cierto, no es necesario analizar la cadena de formato de dos caracteres, pero no consideraría una _huge_ win. –

+2

También se pueden evitar todas las demás funciones de análisis que se incluyen durante el viaje con la familia printf(). Recuerde: hay otras cosas en esta vida además de analizar cadenas de formato. Al igual que la huella de memoria. –

2

Una función "itoa" tendría que devolver una cadena. Dado que las cadenas no son objetos de primera clase, la persona que llama debería pasar una longitud buffer + y la función debería tener alguna forma de indicar si se quedó sin espacio o no. En el momento en que llegas tan lejos, has creado algo lo suficientemente similar a sprintf que no vale la pena duplicar el código/funcionalidad. La función "atoi" existe porque es menos complicada (y posiblemente más segura) que una llamada "scanf" completa. Una función "itoa" no sería lo suficientemente diferente como para valer la pena.

+0

No realmente. Muchos desarrolladores incluyeron itoa() - como rutinas en el código a través de los años. El tamaño máximo del búfer estaba bien delimitado: 6 bytes y un repuesto para el NUL para boxen de 16 bits, y 11 más un repuesto para el boxen de 32 bits. Uso una función itoa() en una pieza de firmware de adquisición de datos para formatear una cadena de texto que contiene la versión y la información de estado. En esa implementación, paso un puntero, pero he visto que el buffer es estático. La mejor explicación es que, al igual que los estándares, hay tantas implementaciones diferentes de itoa() para elegir. –

+0

@JulieinAustin - No estoy diciendo que no existan, solo que no están "estandarizados". Tu descripción ayuda a mostrar por qué. El tamaño del buffer difiere según el tamaño de registro de la máquina. El comité de estándares de C se mantiene alejado de detalles específicos del hardware como este. Una función estandarizada debería tener una interfaz consistente y funcionar igual en ** cualquier ** plataforma, y ​​la única manera práctica de hacerlo es reinventando la mayor parte de 'printf()'. – bta

+0

Estaba respondiendo a su afirmación de que la función tendría = tener = para hacer todo tipo de cosas. En realidad no es así, y la implementación podría especificarse fácilmente utilizando números adecuados de comadrejas para evitar las diferencias en el tamaño de la palabra. Quiero decir, para cualquier tamaño de palabra dado, hay un número finito de caracteres de almacenamiento bien comprendido que se requieren para representar todos los valores enteros posibles para ese tamaño de palabra. TL; DR: puede ser, y ha sido, implementado mucho más fácil y consistentemente de lo que usted sugiere. –

1

La función itoa no es estándar, probablemente por el hecho de que no existe una definición coherente. Diferentes proveedores de compiladores y bibliotecas han introducido versiones sutilmente diferentes, posiblemente como una invención para servir como complemento de atoi.

Si alguna función no estándar es ampliamente proporcionada por los distribuidores, el trabajo de la norma es codificar que: básicamente agregar una descripción de la función existente a la norma. Esto es posible si la función tiene convenciones y comportamiento de argumento más o menos consistente.

Dado que ya existen varios sabores de itoa, dicha función no se puede agregar a ISO C. Cualquier comportamiento que se describa estaría en desacuerdo con algunas implementaciones.

itoa ha existido en formas tales como:

void itoa(int n, char *s); /* Given in _The C Programming Language_, 1st ed. (K&R1) */ 

void itoa(int input, void (*subr)(char)); /* Ancient Unix library */ 

void itoa(int n, char *buf, int radix); 
char *itoa(int in, char *buf, int radix); 

Microsoft ofrece en su ejecución C Biblioteca Visual vez bajo el nombre alterado: _itoa.

no sólo han proporcionado históricamente C implementaciones en los términos de las diferentes definiciones, C programas también proporcionan una función llamada función itoa por sí mismos, lo cual es otra fuente de posibles enfrentamientos.

Básicamente, el identificador itoa es "radiactivo" con respecto a la estandarización como un nombre externo o macro. Si tal función está estandarizada, tendrá que tener un nombre diferente.

Cuestiones relacionadas