2012-04-15 33 views
9

Perché questa distinzione? Sono sbarcato con problemi terribili, supponendo che itoa sia in stdlib.h e alla fine finisca col collegamento di una versione personalizzata di itoa con un prototipo diverso e producendo quindi alcuni errori folli.atoi è una funzione standard. Ma non lo è itoa. Perché?

Quindi, perché la funzione itoa non è una funzione standard? Che cosa c'è che non va? E perché è lo standard parziale verso il suo gemello atoi?

+11

'atoi' è storico,' itoa' non lo è. Non dovresti comunque usare 'atoi',' strto (u) l (l) 'è quello che dovresti usare. Per l'altra direzione, 's (n) printf'. –

+0

Come 'itoa' non è una funzione standard puoi includere quale dovrebbe essere il contratto di interfaccia per la funzione' itoa' che vuoi discutere?(Ciò potrebbe rispondere alla tua domanda) –

+0

@CharlesBailey Sono solo curioso in generale sul perché lo standard includesse atoi e non itoa –

risposta

7

No itoa n. itoa è mai stato standardizzato, quindi per aggiungerlo allo standard occorrerebbero un motivo valido e una buona interfaccia per aggiungerlo.

La maggior parte dei itoa interfacce che ho visto usare un buffer statico che ha problemi di re-entrancy e durata, allocare un buffer dinamica che il chiamante ha bisogno di liberare o richiedere all'utente di fornire un buffer che rende l'interfaccia non è migliore di sprintf.

+2

itoa() con un buffer passato può essere un enorme vantaggio su s (n) printf() quando non viene utilizzato nient'altro da quella particolare parte della libreria (niente nella famiglia printf()). Non è una ragione per mettere itoa() nella libreria C standard, ma è un motivo per preferirlo a qualcosa di molto più pesante. –

+0

@JulieinAustin: Perché è una grande vittoria? È vero, non devi analizzare la stringa di due caratteri, ma non considererei una _huge_ vincita. –

+2

È inoltre possibile evitare tutte le altre funzioni di analisi che accompagnano la corsa con la famiglia printf(). Ricorda: ci sono altre cose in questa vita oltre all'analisi delle stringhe di formato. Ad esempio, l'impronta della memoria. –

2

Una funzione "itoa" dovrebbe restituire una stringa. Poiché le stringhe non sono oggetti di prima classe, il chiamante dovrebbe passare un buffer + lunghezza e la funzione dovrebbe avere un modo per indicare se è scaduto o meno. Quando arrivi così lontano, hai creato qualcosa di simile a sprintf che non vale la pena duplicare il codice/funzionalità. La funzione "atoi" esiste perché è meno complicata (e probabilmente più sicura) di una chiamata "scanf" completa. Una funzione "itoa" non sarebbe abbastanza diversa per valerne la pena.

+0

Non proprio. Molti sviluppatori hanno incluso itoa() - come routine nel codice nel corso degli anni. La dimensione massima del buffer era ben delimitata: 6 byte e un ricambio per NUL per boxen a 16 bit e 11 più un ricambio per boxen a 32 bit. Io uso una funzione itoa() in un pezzo di firmware di acquisizione dati per formattare una stringa di testo contenente informazioni sulla versione e sullo stato. In quell'implementazione faccio passare un puntatore, ma ho visto che il buffer è statico. La migliore spiegazione è che, proprio come gli standard, ci sono così tante diverse implementazioni itoa() tra cui scegliere !!! –

+0

@JulieinAustin - Non sto dicendo che non esistono, solo che non sono _standardized_. La tua descrizione aiuta a mostrare perché. La dimensione del buffer varia in base alle dimensioni del registro della macchina. Il comitato per gli standard C non tiene conto di dettagli specifici dell'hardware come questo. Una funzione standard dovrebbe avere un'interfaccia coerente e funzionare allo stesso modo su ** qualsiasi ** piattaforma, e l'unico modo pratico per farlo è reinventare la maggior parte di 'printf()'. – bta

+0

Stavo rispondendo alla tua affermazione che la funzione avrebbe = avere = fare ogni genere di cose. In realtà non lo è, e l'implementazione potrebbe essere facilmente specificata usando un numero adeguato di parole di donnola per aggirare le differenze nella dimensione della parola. Voglio dire, per ogni dimensione di parola data, c'è un numero finito e ben definito di caratteri di archiviazione che sono necessari per rappresentare tutti i possibili valori interi per quella dimensione di parola. TL; DR - può essere, ed è stato, implementato in modo molto più semplice e coerente di quello che suggerisci. –

1

La funzione itoa non è standard probabilmente per la ragione è che non esiste una definizione coerente di esso. Diversi produttori di compilatori e librerie hanno introdotto versioni leggermente diverse di esso, possibilmente come un'invenzione che funge da complemento allo atoi.

Se alcune funzioni non standard sono ampiamente fornite dai fornitori, il lavoro dello standard è codifica: in pratica si aggiunge una descrizione della funzione esistente allo standard. Questo è possibile se la funzione ha convenzioni e comportamenti di argomento più o meno coerenti.

Poiché più aromi di itoa sono già disponibili, tale funzione non può essere aggiunta in ISO C. Qualsiasi comportamento descritto potrebbe essere in contrasto con alcune implementazioni.

itoa è esistito in forme come:

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 fornisce nel loro Visual C Run Time libreria sotto il nome alterato: _itoa.

Non solo hanno C implementazioni storicamente disponibile sotto diverse definizioni, C programmi forniscono anche una funzione denominata itoa funzione per se stessi, che è un'altra fonte di possibili scontri.

In linea di principio, l'identificatore itoa è "radioattivo" per quanto riguarda la standardizzazione come nome o macro esterna. Se tale funzione è standardizzata, dovrà essere sotto un nome diverso.