VS2017 C/C++輸入密碼顯示*星號


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()函數,網上的解釋已經非常清楚了就不再贅述。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM