核心定義
\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 | 效果 |
\n | Line Feed (LF) | 0x0A | 換行 (Unix) / 換行+歸行首 (Windows 文本模式) |
\r | Carriage Return (CR) | 0x0D | 歸行首 |
\t | Horizontal Tab (HT) | 0x09 | 跳至下一制表位 (通常 8 的倍數列) |
\v | Vertical Tab (VT) | 0x0B | 垂直制表 (罕用) |
\f | Form Feed (FF) | 0x0C | 換頁 (打印機/終端清屏) |
\a | Alert (BEL) | 0x07 | 蜂鳴/視覺閃爍 |
\\ | Backslash | 0x5C | 字面反斜桿 |
\' | Single Quote | 0x27 | 字面單引號 (字符常量中) |
\" | Double Quote | 0x22 | 字面雙引號 (字符串常量中) |
\? | Question Mark | 0x3F | 避免三字母組 (如 ??= → #) |
\nnn | Octal | - | 1-3 位八進制 (如 \101 = 'A') |
\xhh | Hex | - | 1-2 位十六進制 (如 \x41 = 'A') |
\uhhhh | Unicode BMP | - | 4 位十六進制 (C99/C11) |
\Uhhhhhhhh | Unicode Full | - | 8 位十六進制 (C99/C11) |