這個如此詭異的C語言 怪事 是怎麼回事?

時間 2021-05-11 13:45:05

1樓:養貓的哈士奇

@pansz 和 @北極 說的已經很清楚了,我這裡補充一下你的debug過程是有問題的,所以導致你沒找出來問題所在。

1.在程式中的賦值一定要清楚的知道自己賦的是什麼值,想呈現的效果又是什麼,先看賦值和輸出,在WinHex中可以很清楚的看到字串對應的ascii碼,對比很容易發現你所謂的詭異的事情就是實際輸出多了乙個0x0D,在ascii碼中他是空的。首先你要知道多出來的這個是什麼,查一下ascii碼表你會知道0x0D含義就是\r(回車)。

2.因為你輸入的0x0A的前面是0x00,就是乙個null字元,中間多出來的0x0D一定是跟0x0A有關的,(我記得上學的時候老師會說回車和換行的問題,這個不是重點),此時問題就變成輸入換行(\n 0x0A)為什麼會變成回車、換行(\n0x 0D \r 0x0A)。

3.接著看程式,你的輸入定義是很清晰的這是肯定沒有問題的,如果有問題就肯定是對於檔案的操作上,第一步就是fopen_s()這個函式開啟檔案,你就要去檢視一下這個函式的引數的具體定義於是你就會找到 @北極回答的內容,問題就可以解決了。

4.問題解決了,再思考一下換行(\n 0x0A)為什麼會變成回車、換行(\n0x 0D \r 0x0A)?你再查一查就找到了 @pansz 說的內容。

2樓:風中勁草

直接回答問題,不羅嗦

因為你的open函式,第二個引數沒加b(二進位制方式)所以其實是用文字方式開啟的

然後在NT系統下換行是\r\n,對應0D0A有問題請追問

3樓:

這個啊。。。你開啟檔案的時候記得按二進位制開啟。。。不然windows系統會當它是txt,自動給你補換行符。。。

怎麼按二進位制開啟?。。。在開啟檔案時的開啟型別,就是什麼「w」、「a」、「r」的後面加個「b」,變成「wb」、「ab」、「rb」就可以了。。。

4樓:血小板自動機

windows平台下的位元組流和字元流得格外的注意,其他答主也說得很清楚了。

這個鍋我以前也遇到過,起因是我給學院比賽出題時,裡面恰巧有一道字串的題,在win10平台造的資料,因為偷懶就直接用輸出重定向了,當時在本地跑怎麼都沒問題,然後放到判題姬上就一直WA,經過除錯發現是因為在Linux環境下換行符問題導致讀取錯誤。

Linux下的換行符是\n,Windows下的換行符是\r\n。這樣,乙個直接後果是,Unix/Mac系統下的檔案在Windows裡開啟的話,所有文字會變成一行;而Windows裡的檔案在Unix/Mac下開啟的話,在每行的結尾可能會多出乙個^M符號。

解決方法就是,解除安裝windows,裝Linux(大霧

5樓:Yanchen Shi

補充下 @pansz 的回答。根本原因就是回車與換行的區別。在我們口頭的表述中,回車與換行應該沒什麼區別,相當於敲一下回車鍵而已。

但計算機底層實現中回車與換行是兩種不同的操作。題主這裡的0x0D就是\r,即回車。0x0A就是\n,即換行。

Windows中用\r\n兩個字元表示回車換行,這可謂是打字機時代的遺產了。

\r,或者說回車鍵,英文叫Carriage Return,簡稱CR。所以\r使用了Return的首字母表示這個操作。Carriage一詞有馬車、客車的意思,Return自然是返回,合起來就翻譯成了回車。

這個本質上就是打字機時代的產物,打字機上面橫著的部分就叫Carriage。如果看過打字機工作的模樣,就知道隨著我們打字,這個Carriage會從左往右移動,直到一行的最右端。這個時候我們就需要扳一下回車扳機(Carriage Return Lever),這樣Carriage就會回到這一行的最左邊。

但是光回到這一行的最左邊還不行,這個時候如果直接打字就會覆蓋掉之前的文字。所以還需要乙個鍵,讓Carriage轉動一下,對準下面空白的部分,這就是換行。英文叫Newline,能看出\n取用了其首字母n。

英文又叫Line Feed,簡稱LF。於是回車+換行合起來構成了乙個完整的操作,英文中經常能看到用CRLF指代乙個\r\n操作。

放在計算機上的話可以理解成\r讓游標回到這一行的最左邊,\n讓游標進入下一行。這個\r\n合起來才表示乙個完整的回車換行操作繼承到了Windows中。但是在Unix/Linux系統中,\n已經表達了全部的回車換行操作,畢竟確實沒什麼必要拆開回車與換行。

如果有過跨系統傳文字文件的同學,可能會碰過文件換行不正常的問題。這也是\r\n與\n的區別的問題。在如今我們的口頭的表達上,換行與回車也基本是同乙個意思,除非是特殊語境下,否則不會區分兩個詞的含義。

紅框裡的單詞對應的就是回車扳機

6樓:

嚇死我了,粗看一眼以為是陣列初始化用的rodata section錯了,這麼嚴重的bug還得了!!!

再一看原來是寫入檔案……

C語言這個題怎麼編寫?

不知所以 可以換個思路。首先做乙個素數表 陣列 然後用迴圈 雙重迴圈 做出素數表內任意兩個素數輸出 陣列 注意兩個素數之和小於100 TheBadZhang 輸入偶數 如果這個偶數是4,列印 2 2 結束判斷 a從3迴圈到這個偶數的一半步進為2 如果 a是素數而且偶數 a 也是素數 列印 a 偶數 ...

怎麼用c語言解決這個問題

深黑灰 x 100 a x 268 b b a 168 b a b a 又因為b,a為整數,b a為168因數,所以b a小於168,所以調查168的所有因數從2到n 注 n n 168 168 b a b a 根據除數和商易求得b或a的值,於是a 100 x 劉偉奇 include include...

怎麼用c語言編這個程式??

燕歸 這個是根據字串的accii編碼大小進行公升序排序。思路 定義乙個字串陣列儲存需要排序字串,進行冒泡公升序排序,輸出字串陣列值。 printf鴻澤 有答主寫了氣泡排序,個人覺得不太合適,像ASCII這樣範圍明確的可以用計數排序,也叫桶排序,實現線性時間複雜度。void CharSort char...