2015-05-17 15 views
20

Code:Was bedeutet "^ @" in der Datei?

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

ich kompilieren es mit

$ gcc test.c -o test 

und laufen als

$ ./test 

Dann öffne ich die fruit Datei, und ich sehe die folgenden in der Datei:

apple^@ 

Was bedeutet ^@?

+7

ändern 'sizeof ("Apfel")' auf 'strlen (“ zu erhalten apple ")', um es loszuwerden –

+1

In diesen Fällen, verwenden Sie ein Hexdump-Programm, um sicher über den Inhalt der Datei zu sein http://www.theunixschool.com/2011/06/3-different-ways-of-dumping -hex.html – leonbloy

Antwort

40

Es ist der Nullzeichencode '\0'. Bestimmte Editoren wie vi zeigen es als ^@ an.

sizeof("apple") würde 6 zurückgeben, da es das Nullzeichen enthält, das zum Beenden von Zeichenfolgen verwendet wird.

+0

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

38

Die ^@ ist die Art und Weise, wie ein ASCII NUL in druckbarer Form dargestellt wird. Das ist das gleiche wie der @ Charakter mit einigen Bits entfernt:

@ = 0100 
^@ = 0 

und es ist die gleiche wie '\0' (das String-Terminator in C). Da es sich um den String-Terminator handelt, würden Sie es nicht von printf oder den zugehörigen Funktionen sehen, aber Sie können es problemlos mit der blockorientierten write erstellen. Zum Beispiel haben Sie

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

und

apple^@orange^@ 

weil jeden doppelte Anführungszeichen Literal in C ein nachgestellten String-Terminator aufweist, die in ihrer Größe geschrieben zu sehen waren gezählt. Wenn Sie die Zeichenfolge ohne seine Terminator zu schreiben hatte gemeint, könnten Sie dies getan haben:

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

dadurch eliminiert zwei Probleme im Beispiel: (a) eine falsche Länge und (b) möglicherweise inkonsistent String Inhalt und Länge unter Verwendung von Sicherstellen, dass beide der gleiche Gegenstand sind. Siehe Sizeof string literal für einige Kommentare zu (a).

NUL ist eines der 32 ASCII-Steuerzeichen, deren Werte zwischen 0 und 31 liegen, C0-Steuerelemente genannt. Alle diese ASCII-Steuerzeichen werden normalerweise auf diese Weise (für eine druckbare Form) angezeigt, wobei das Zeichen verwendet wird, das dem Wert des Steuerzeichens 64 (0100) hinzufügt.

ASCII DEL ist 127 (0177). Die Anzeige als ^? ist ein Spezialfall, der neuer ist als die anderen ASCII-Steuerzeichen. Zum Beispiel, X/Open terminfo (curses) definiert keine druckbare Form für dieses Zeichen, obwohl es für die anderen tut. Im Gegensatz zu den anderen ASCII-Steuerzeichen wird DEL durch ODER-Verknüpfung aller (sieben) Bits in das Zeichen gebildet.

ASCII ist natürlich ein 7-Bit-Code.Viele andere Codes wurden entwickelt; ASCII entspricht der POSIX portable character set, daher ist es häufig anzutreffen.

Es ist einfach, Tabellen von ASCII-Zeichen mit einer Websuche zu finden. Die meisten dieser Tabellen (oder ihre begleitende Diskussion) weichen in Fehlinformationen ab. Hier ist ein Link zu einer einigermaßen sachlichen Seite mit dem Titel ASCII Character Set. Darin heißt es

Die Steuerungstaste 64 von dem Wert des Schlüssels abzieht, die es modifiziert.

Allerdings ist die Aussage nur dann richtig, wenn der Schlüssel einer von denen aus der Menge ist @, A, B, etc. Wenn Sie auf andere Tasten gelten, dass die Ergebnisse vielleicht interessant sind, aber nicht sinnvoll. Vielmehr wird in einem C-Programm würden Sie eine logische Maskierung tun, zum Beispiel

ch = ch & 037; 

ein Zeichen im Bereich von 0 bis 31

+1

DEL auch, die als '^?' angezeigt werden kann (in diesem Fall mit dem 0x40-Bit gelöscht anstatt gesetzt) . – deltab

+0

Betrachten Sie das Hinzufügen von "weil es kein * definiertes * druckbares Formular" im vierten Absatz gibt :) – usr2564301

+1

BTW-Unicode [definiert] (http://unicode.org/charts/PDF/U2400.pdf) Symbolzeichen für Steuerzeichen : ␀ ␡ (Ihr Browser zeigt sie jedoch möglicherweise nicht an.) –