getch(),scanf 會回顯輸入字符,不適合密碼輸入。#include
#include
#include
int getch_hidden() {
struct termios oldt, newt;
int ch;
tcgetattr(STDIN_FILENO, &oldt); // 保存當前屬性
newt = oldt;
newt.c_lflag &= ~(ECHO | ICANON); // 關閉回顯、規范模式
tcsetattr(STDIN_FILENO, TCSANOW, &newt); // 立即生效
ch = getchar(); // 讀取單字符
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); // 恢復原屬性
return ch;
}
int main() {
char pwd[32] = {0};
printf("Password: ");
for (int i = 0; i < 31; i++) {
int c = getch_hidden();
if (c == '\n' || c == '\r' || c == EOF) break;
pwd[i] = c;
putchar('*'); // 可選:顯示掩碼字符
}
printf("\nInput: %s\n", pwd);
return 0;
}
ECHO:控制輸入字符是否回顯到終端。ICANON:關閉規范模式後,getchar() 可逐字符讀取,無需等待回車。通過 termios 動態修改終端屬性,實現無回顯、逐字符讀取的密碼輸入體驗,跨 Linux/Unix 平台通用。