2015-05-17 57 views
20

代碼:文件中的「^ @」是什麼意思?

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

$ gcc test.c -o test 

編譯和運行作爲

$ ./test 

然後我打開fruit文件,我看到文件中的以下內容:

apple^@ 

^@是什麼意思?

+7

變化'的sizeof(「蘋果」)''到的strlen(」蘋果「)'擺脫它 –

+1

在這些情況下,使用一個hexdump程序來確保文件的內容http://www.theunixschool.com/2011/06/3-different-ways-of-dumping -hex.html – leonbloy

回答

40

它是空字符代碼'\0'。某些編輯人員如vi將其顯示爲^@

sizeof("apple")將返回6,因爲它包含用於終止字符串的空字符。

+0

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

38

^@是ASCII NUL通常以可打印形式表示的方式。這是相同@字符除去一些位:

@ = 0100 
^@ = 0 

,它是相同的'\0'(在C字符串終止子)。因爲它是字符串終結符,所以您不會從printf或其相關函數中看到它,但可以使用面向塊的write輕鬆創建它。例如,你可以寫

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

,看到

apple^@orange^@ 

因爲雙引號用C字面具有在它的大小計算尾隨字符串結束。如果你本來還打算寫沒有它的終結符,你可以這樣做:

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

從而消除了例如兩個問題:(1)不正確的長度和(b)可能使用不一致的字符串內容和長度由確保兩者都是相同的物品。對(a)的一些評論見Sizeof string literal

NUL是32個ASCII控制字符之一,其值在0到31之間,被稱爲C0控件。 所有這些ASCII控制字符通常以這種方式顯示(對於可打印的表格),使用與將控制字符的值添加64(0100)相對應的字符。

ASCII DEL是127(0177)。顯示爲^?是比其他ASCII控制字符更新的特殊情況。例如,X/Open terminfo(curses)沒有爲這個字符定義一個可打印的表單,雖然它爲其他人做了。與其他ASCII控制字符不同,DEL是通過將所有(7)位或字符組成字符而形成的。

當然,ASCII是一個7位代碼。許多其他的代碼被開發出來ASCII對應於POSIX portable character set,所以經常遇到。

通過網頁搜索很容易找到ASCII字符表。大多數這些表格(或其伴隨的討論)轉向誤傳。這裏是一個合理的事實頁面的鏈接,標題爲ASCII Character Set。它聲明

控制密鑰從它修改的密鑰的值中減去 64。

但是,如果關鍵是那些從集@AB之一等。如果您應用到其它鍵,結果也許是有趣的,但沒有用的語句是唯一正確的。相反,在C程序你會做的邏輯掩蔽,例如,

ch = ch & 037; 

以獲得字符取值範圍爲0到31。

+1

DEL也可以顯示爲'^?'(在這種情況下0x40位清零而不是設置) 。 – deltab

+0

考慮在第4段中添加「因爲沒有*定義的*可打印格式」:) – usr2564301

+1

BTW-Unicode爲控制字符確定了[define](http://unicode.org/charts/PDF/U2400.pdf)符號字符:␀␡(儘管您的瀏覽器可能不會顯示它們。) –