2014-06-24 70 views
0

ASCII CharacterSet世界中,下面3個空格字符有一個數字。查詢處理TAB字符?

Space(32) LineFeed(10) CarriageReturn(13) 

所以,這是很容易寫一個程序在便攜方式使用某種編程語言(如C),通過使用下面的符號來讀取或寫入標準的方式,例如空格字符,

LineFeed - '\n' 
Carriage Return - '\r' 
Space - ' ' 

我瞭解到TAB是有時候有4個或有時候有8個Space個字符的集合。

我的問題:

我如何理解 '\ t' 字的編程語言(如C)的含義?當CharacterSet世界中沒有TAB的標準定義時?

+4

「TAB是有時4個或有時8個空格(32)字符的集合。」也許在你的編輯器中,但是在編碼點的世界裏,它是它自己的實體:''\ t'',[ASCII值#9](http://www.asciitable.com)。 – WhozCraig

+0

在C中,我們說'if(ch =='\ t')',它是如何工作的,當你沒有多少空間字符與TAB? – overexchange

+0

@WhozCraig哦,你的意思是按照ASCII的值9? – overexchange

回答

2

在ASCII,水平Tab是代碼9. ASCII水平製表是代碼9不論設定的代碼被寫入在什麼字符的

在。 C,'\t'是源代碼字符集中的水平製表符,無論IO的字符集如何。 '\t'的整數值可能不是9.

IO(例如文件)的代碼和字符集的字符集通常是相同的。在2014年,通常都有ASCII碼(至少ASCII碼爲0 - 127)。

在C中,打印'\t'有點精確;

Moves the active position to the next horizontal tabulation position on the current line. If the active position is at or past the last defined horizontal tabulation position, the behavior of the display device is unspecified. C11 §5.2.2 2

隨着ASCII,所述Horizontal Tab旨在不表示可打印的信息,而是以控制設備。 ASCII原始定義導致對控制設備的精確操作產生歧義:移至下一個製表位。

鑑於這些相似但含義不同,並承認其他語言有不同的含義,其確切含義高度依賴於情況。因此爲了保持便攜性,需要其他情況依賴信息(例如,一個製表符的定義或列表)至,準確地說生成並解釋一個水平製表符。

推薦:
除非數據格式要求(CSVmakefile),不生成標籤,但空間。在閱讀'\t'時,將其解釋爲與一個或多個連續空格相同。

+0

我記得使用製表符和空格的一些聖戰。也許你應該澄清一下「推薦」是什麼意思:是你的個人意見?這是一些特定社區的共識嗎? – anatolyg

+0

@anatolyg這裏的未推薦「推薦」是我的觀點支持我的聲譽。 – chux

+0

@chux在你的回答中有很多東西,對我來說有很多新的要點,我會正確地閱讀這些內容並向你提出問題。 – overexchange

0

做什麼用的標籤取決於

  • 什麼樣的輸入您要處理
  • 設備的能力,你的目標

一個標籤是指爲彈性定界符告訴設備移動到下一個製表位。用N個空格替換標籤只是窮人的處理。要正確呈現選項卡,您需要以某種方式找出適當的製表位。

當使用製表符作爲字段分隔符到文本終端上時,您需要加載表格,計算每列中的字符數,然後用空格填充每個字段,以適合該列中最寬的字段。在這種情況下,製表符的長度由您在下一列之前必須寫入的字符數量決定,而字符數量隨當前行的內容而變化。

製表停止的實際例子:http://nickgravgaard.com/elastictabstops/

0

這只是對其他答案的補充。製表通常設置在位置4*n8*n(這裏我使用的是基於0的位置編號)。如果光標位於x位置,輸出它跳轉到下一個製表位製表符之後:

x = (x/8 + 1) * 8; 

或者如果製表停止具有s(通常s是4或8,如所提到的)間距:

x = (x/s + 1) * s; 

但是,如果製表符完全靈活(例如,用戶可以在Microsoft Word中指定每個製表位),則不存在此類公式。