【冷知識(shí)】關(guān)于/r與/n以及 /r/n 的區(qū)別總結(jié)

首先:

\r就是"回到行首",\n就是"到下一行"

即:\r回車,\n換行,前者使光標(biāo)到行首,后者使光標(biāo)下移一格
通常用的Enter是兩個(gè)加起來(lái)的,即\r\n

直接這么說(shuō)你可能沒(méi)啥感覺(jué),但是真正到了編碼的時(shí)候你就發(fā)現(xiàn)了——全TM是吭
先舉個(gè)栗子瞅瞅:

printf aaaa \r\n bbbbbb
print ccccc \n ddddddd
print eeeeeeeee \r ffffff

上面這段代碼的輸出結(jié)果你可能一眼就看出來(lái)了。
你說(shuō)是這樣:

aaaa
bbbbbb
ccccc
ddddddd
eeeeeeeee
ffffff

但是真的是你想的那樣嗎?
事實(shí)上結(jié)果是下面這樣

aaaa
bbbbbb
ccccc
ddddddd
ffffff

由來(lái):

在計(jì)算機(jī)還沒(méi)有出現(xiàn)之前,有一種叫做電傳打字機(jī)(Teletype Model 33)的玩意,每秒鐘可以打10個(gè)字符。但是它有一個(gè)問(wèn)題,就是打完一行換行的時(shí)候,要用去0.2秒,正好可以打兩個(gè)字符。要是在這0.2秒里面,又有新的字符傳過(guò)來(lái),那么這個(gè)字符將丟失。

于是,研制人員想了個(gè)辦法解決這個(gè)問(wèn)題,就是在每行后面加兩個(gè)表示結(jié)束的字符。一個(gè)叫做“回車”,告訴打字機(jī)把打印頭定位在左邊界;另一個(gè)叫做“換行”,告訴打字機(jī)把紙向下移一行。

這就是“換行”和“回車”的來(lái)歷,從它們的英語(yǔ)名字上也可以看出一二。

后來(lái),計(jì)算機(jī)發(fā)明了,這兩個(gè)概念也就被般到了計(jì)算機(jī)上。那時(shí),存儲(chǔ)器很貴,一些科學(xué)家認(rèn)為在每行結(jié)尾加兩個(gè)字符太浪費(fèi)了,加一個(gè)就可以。于是,就出現(xiàn)了分歧。

  • Unix系統(tǒng)里,每行結(jié)尾只有“<換行>”,即“\n”;
  • Windows系統(tǒng)里面,每行結(jié)尾是“<換行><回車>”,即“\n\r”;
  • Mac系統(tǒng)里,每行結(jié)尾是“<回車>”。

一個(gè)直接后果是,Unix/Mac系統(tǒng)下的文件在Windows里打開(kāi)的話,所有文字會(huì)變成一行;而Windows里的文件在Unix/Mac下打開(kāi)的話,在每行的結(jié)尾可能會(huì)多出一個(gè)^M符號(hào)。

后果:

現(xiàn)在再來(lái)看看咱們開(kāi)頭舉得那個(gè)栗子:

printf aaaa \r\n bbbbbb
print ccccc \n ddddddd
print eeeeeeeee \r ffffff

編程時(shí)(無(wú)論是windows系統(tǒng)還是linux系統(tǒng))
\r 就是return 回到本行行首,這就會(huì)把這一行以前的輸出覆蓋掉,具體內(nèi)部細(xì)節(jié)就像是輸出緩沖區(qū)重新開(kāi)始緩沖了一樣
\n 是換行+回車,把光標(biāo)先移到下一行,然后換到行首->也就是下一行的行首

所以若是看到代碼里面本來(lái)應(yīng)該換行的地方變成了整行、

本來(lái)該輸出整行的時(shí)候卻只輸出了一部分、

那么,查一查是不是你的\r,\n,\r\n哪個(gè)用錯(cuò)了吧?。〒Q平臺(tái)尤其要注意)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容