2015-05-17 21 views
20

Codice:Cosa significa "^ @" nel file?

int fd; 
fd = open("fruit", O_WRONLY); 
write(fd, "apple", sizeof("apple")); 
close(fd); 

compilo con

$ gcc test.c -o test 

e corro come

$ ./test 

Poi ho aperto il file fruit, e vedo il seguente nel file:

apple^@ 

Che cosa significa "^@"?

+7

Change 'sizeof ("Apple")' a 'strlen (" apple ")' per liberarsene –

+1

In questi casi, usa un programma hexdump per essere sicuro del contenuto del file http://www.theunixschool.com/2011/06/3-different-ways-of-dumping -hex.html – leonbloy

risposta

40

È il codice carattere nullo '\0'. Alcuni editor come vi lo visualizzano come ^@.

sizeof("apple") restituisce 6 perché include il carattere null utilizzato per terminare le stringhe.

+0

Correlato: http://stackoverflow.com/questions/1392200/sizeof-string-literal – usr2564301

38

Il ^@ è il modo in cui un NUL ASCII viene comunemente rappresentato in forma stampabile. Che è lo stesso come il carattere @ con alcuni pezzi rimossi:

@ = 0100 
^@ = 0 

ed è uguale '\0' (terminatore stringa in C). Poiché è il terminatore di stringhe, non lo vedresti da printf o dalle sue funzioni correlate, ma puoi facilmente crearlo utilizzando lo write orientato al blocco. Ad esempio, si potrebbe avere scritto

write(fd,"apple\0orange",sizeof("apple\0orange")); 

e visto

apple^@orange^@ 

perché ogni doppio citato letterale in C ha un terminatore di stringa finale che viene conteggiato nella sua dimensione. Se si fosse inteso per scrivere la stringa senza il terminatore, che avrebbe potuto fare questo:

const char *s = "apple"; 
write(fd,s,strlen(s)); 

eliminando due problemi nell'esempio: (a) lunghezza scorretto e (b) eventualmente utilizzando contenuto della stringa incoerente e lunghezza da assicurando che entrambi siano lo stesso oggetto. Vedere Sizeof string literal per alcuni commenti su (a).

NUL è uno dei 32 caratteri di controllo ASCII i cui valori vanno da 0 a 31, chiamati Controlli C0. Tutti questi caratteri di controllo ASCII vengono in genere visualizzati in questo modo (per una forma stampabile), utilizzando il carattere corrispondente all'aggiunta di 64 (0100) al valore del carattere di controllo.

ASCII DEL è 127 (0177). Visualizzarlo come ^? è un caso speciale che è più recente rispetto agli altri caratteri di controllo ASCII. Per esempio, X/Open terminfo (curses) non definisce una forma stampabile per questo personaggio, sebbene lo faccia per gli altri. A differenza degli altri caratteri di controllo ASCII, il numero DEL è formato dall'interruzione di tutti i (sette) bit nel carattere.

ASCII è un codice a 7 bit, ovviamente.Sono stati sviluppati molti altri codici; ASCII corrisponde allo POSIX portable character set, quindi è frequente.

È facile trovare tabelle di caratteri ASCII con una ricerca Web. La maggior parte di queste tabelle (o la loro discussione di accompagnamento) vira fuori nella disinformazione. Ecco un collegamento a una pagina ragionevolmente effettiva, intitolata ASCII Character Set. Si afferma

Il tasto Control sottrae 64 dal valore delle chiavi che esso modifica.

Tuttavia, l'affermazione è corretta solo se la chiave è uno di quelli dal set @, A, B, ecc Se si applica che ad altri tasti, i risultati sono forse interessanti ma non utile. Piuttosto, in un programma C si farebbe un mascheramento logico, ad esempio,

ch = ch & 037; 

per ottenere un carattere nell'intervallo da 0 a 31.

+1

DEL, che può essere mostrato come '^?' (in questo caso con 0x40 bit cancellato anziché impostato) . – deltab

+0

Considera di aggiungere "perché non esiste una * forma * stampabile * definita" al 4 ° paragrafo :) – usr2564301

+1

BTW-Unicode fa [define] (http://unicode.org/charts/PDF/U2400.pdf) caratteri simbolo per i caratteri di controllo : ␀ ␡ (Il tuo browser potrebbe non visualizzarli, però.) –

Problemi correlati