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

C語言轉義字符 \b 詳解:退格符的視覺效果與實際行為

     編輯:C 語言問答

核心定義

\b (Backspace, ASCII 0x08):**光標左移一格**,**不刪除字符**,後續輸出會**覆蓋**原位置字符。

視覺效果演示


printf("ABC\bD");     // 輸出: ABD  (C 被 D 覆蓋)
printf("1234\b\bXY"); // 輸出: 12XY (3 被 X 覆蓋, 4 被 Y 覆蓋)
printf("Hello\b \b"); // 輸出: Hell (用空格覆蓋 o,再退格,視覺上刪除)

常見誤區

誤區真相
\b 能刪除文件/緩衝區中的字符**不能**。只影響終端顯示,底層數據不變
\b 等同於鍵盤 Backspace 鍵**不同**。鍵盤 Backspace 通常由終端驅動處理 (刪除緩衝區字符 + 發送 \b \b 或 \b \0)
printf("%c\b", '*') 能做密碼掩碼**不可靠**。終端可能不支持、重定向到文件時會寫入 \b、多字節字符寬度不一

正確密碼掩碼方案


// Windows
#include 
void read_password(char* buf, int max) {
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode; GetConsoleMode(hStdin, &mode);
    SetConsoleMode(hStdin, mode & ~ENABLE_ECHO_INPUT);
    ReadConsoleA(hStdin, buf, max-1, NULL, NULL);
    buf[strcspn(buf, "\r\n")] = 0;
    SetConsoleMode(hStdin, mode);
}

// Linux/Unix
#include 
void read_password(char* buf, int max) {
    struct termios old, new;
    tcgetattr(STDIN_FILENO, &old);
    new = old; new.c_lflag &= ~ECHO;
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &new);
    fgets(buf, max, stdin);
    buf[strcspn(buf, "\n")] = 0;
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &old);
}

其他轉義符速查

轉義符名稱ASCII效果
\nLine Feed (LF)0x0A換行 (Unix) / 換行+歸行首 (Windows 文本模式)
\rCarriage Return (CR)0x0D歸行首
\tHorizontal Tab (HT)0x09跳至下一制表位 (通常 8 的倍數列)
\vVertical Tab (VT)0x0B垂直制表 (罕用)
\fForm Feed (FF)0x0C換頁 (打印機/終端清屏)
\aAlert (BEL)0x07蜂鳴/視覺閃爍
\\Backslash0x5C字面反斜桿
\'Single Quote0x27字面單引號 (字符常量中)
\"Double Quote0x22字面雙引號 (字符串常量中)
\?Question Mark0x3F避免三字母組 (如 ??= → #)
\nnnOctal-1-3 位八進制 (如 \101 = 'A')
\xhhHex-1-2 位十六進制 (如 \x41 = 'A')
\uhhhhUnicode BMP-4 位十六進制 (C99/C11)
\UhhhhhhhhUnicode Full-8 位十六進制 (C99/C11)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved