2011-12-12 10 views
7

Sto leggendo il Lua reference manual e parla di "zeri incorporati", simboleggiati da "\ 0".Cos'è uno zero incorporato?

Quando provo a vederlo nella console Lua, stampa nulla significativo:

> print "a \0 b" 
a 

Allora, che cosa è questo "zero embedded"?

+1

Sembra che sia il valore NULL .. – clyfe

+0

'NUL', ovvero il byte zero. – lhf

risposta

14

Ogni carattere ha una rappresentazione numerica interna, ad esempio \ 97 per 'a'. Un carattere con codice \ 0 non rappresenta alcun carattere visibile ma viene utilizzato come terminatore in C e in altri linguaggi di programmazione.

Il manuale vuole chiarire che un '\ 0' è non un terminatore in Lua. Significa anche che puoi caricare byte arbitrari in una stringa (immagine, audio, video, codice nativo, ecc.) E non rischi di averlo troncato al primo '\ 0' da qualche funzione di libreria (che potrebbe accadere in C se usi le funzioni relative alle stringhe).

+1

Bene, sembra che la stampa in Lua 5.1 faccia troncare l'output. Immagino che sia solo un caso d'angolo, e verrà risolto nel prossimo Lua 5.2 – marcus

+0

l'output è un effetto collaterale della stampa usando 'puts' da C – daurnimator

0

Il carattere null viene spesso rappresentato come la sequenza di escape \ 0 in letterali di stringa del codice sorgente o costanti di carattere.

Wikipedia Null Character

1

Si sta per essere simile a mettere un carattere NULL in una stringa C. Sebbene l'output di stampa non mostri il carattere b, le altre funzioni Lua dovrebbero funzionare con l'intera lunghezza della stringa (diversamente dalle funzioni di gestione stringa C che funzionano con stringhe terminate NULL).

Un uso di questo sarebbe utilizzare una stringa per contenere più valori separati da \0.

+0

La maggior parte delle funzioni in Lua funzionano effettivamente '\ 0'. Come prova 'print (s: byte (1, -1))' o 'for b in s: gmatch '.' Do print (b) end'. Immagino sia per questo che la stampa è solo per il debug rapido: "la stampa non è intesa per l'output formattato, ma solo come un modo rapido per mostrare un valore, tipicamente per il debug" – jpjacobs

+0

@jpjacobs: Oops. È passato un po 'di tempo da quando ho fatto molto a Lua. Ho aggiornato la mia risposta. – crashmstr

3

\0 è solo un byte con il valore zero, non ha bisogno di alcun nome di fantasia. Le stringhe Lua sono solo stringhe di byte che tengono traccia della loro lunghezza, quindi possono contenere qualsiasi valore di byte, incluso zero. Alcune funzioni trattano queste stringhe di byte come se fossero stringhe C che terminano con \0, apparentemente lo fa print.

Ciò significa che in lua, #s (lunghezza della stringa) è O (1) contro O (n) per le stringhe C. E l'applicazione può usare stringhe lua per qualsiasi flusso di byte, ad esempio testo codificato UTF-16 o contenuto di file binario.

Problemi correlati