首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言 \r 回車與 \n 換行差異:為什麼輸出會覆蓋前一行

     編輯:程式設計疑難解答

現象重現

printf("1abcdefghijklmn\n");
printf("2opqrstuvwxyz01|------\r");
printf("3mmmmmmmmmmmmmm\n");

輸出:

1abcdefghijklmn
3mmmmmmmmmmmmmm|------

將第二行 \r 改為 \n 後正常輸出三行。

核心區別

轉義符名稱光標動作典型用途
\n (LF, 0x0A)換行移至下一行行首Linux/Unix/MacOSX 文本行結束符
\r (CR, 0x0D)回車移至當前行行首經典 MacOS (OS 9) 行結束符;Windows 組合為 \r\n

覆蓋原理解析

  1. printf("2...|------\r") 輸出完畢後,光標停在該行行首(第 0 列)。
  2. printf("3mmmmmmmmmmmmmm\n") 從行首開始寫入,逐字符覆蓋原有內容。
  3. 第三行長度 (15) > 第二行可見部分 (約 18 字符但含 |------),導致第二行內容被完全覆蓋,僅殘留第三行未覆蓋到的尾部 |------。

跨平台換行最佳實踐

  • C 標準庫:文本模式打開文件 ("w"),\n 會自動轉換為平台慣例 (Windows→\r\n, Linux→\n)。
  • 網絡協議:HTTP/HTTPs 規定 \r\n 為行結束符,必須顯式發送。
  • 控制台動畫:利用 \r 實現單行刷新進度條:
    printf("\rProgress: %d%%", p); fflush(stdout);

總結

\r 只回車不換行,導致後續輸出覆蓋當前行;\n 換行並歸列。理解兩者差異,對處理跨平台文本、控制台交互、網絡協議至關重要。現代編程中,除非有特定單行刷新需求,默認使用 \n 並依賴運行庫處理平台差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved