VS2017 C/C++輸入密碼顯示*星號
_getch()函數使用時遇到的坑
參考: https://blog.csdn.net/guin_guo/article/details/46237905
想實現輸入密碼不回顯的功能,找到了上面一篇文章。上面那篇文章中的代碼在dev里跑沒有出現任何問題。
當我拿到VS2017里的時候,首先遇到的是getch()不安全,無奈去查相關內容,改成安全的做法_getch(),又出現了....蜜汁問題
問題1:輸入一個字符回顯兩個星號
問題2:debug發現只能讀進一個字符后便跳出循環
此處略去一天的瞎改瞎試瞎搜...
雖然我實現出我想要的功能效果了,還是不太明白為什么要用兩個while
1 //以下代碼可在VS2017跑通,親測 2 #include<iostream> 3 #include<conio.h> //使用里面的_getch() 4 #include<cstring> 5 #include<cstdlib> 6 using namespace std; 7 8 int main() 9 { 10 char Real_password[50] = "password"; 11 char s[50];//要輸入的密碼 12 char ch; 13 int i = 0; 14 15 bool flg = false; 16 17 while (true) 18 { 19 while (ch = _getch()) 20 { 21 if (ch == '\r') 22 { 23 flg = true; 24 break; 25 } 26 27 if (ch != 8)//回撤是\b,ASCII碼是8 28 {//不是回撤就錄入 29 s[i] = ch; 30 putchar('*');//輸出星號 31 i++; 32 } 33 else 34 { 35 putchar('\b');//回撤一個字符 36 putchar(' ');//顯示空格掩蓋 37 putchar('\b');//再回撤一格等待錄入 38 i--; 39 } 40 } 41 42 if (flg) 43 break; 44 45 } 46 cout << endl; 47 s[i] = '\0'; 48 cout << "密碼:" << s << endl; 49 50 if (strcmp(s, Real_password) == 0) 51 cout << "correct!" << endl; 52 else 53 cout << "wrong!" << endl; 54 system("pause"); 55 return 0; 56 }
PS:
關於getch(),getche(),getchar()函數,網上的解釋已經非常清楚了就不再贅述。
