输入密码回显星号 -- C语言

本文介绍了一个使用C语言实现的密码输入功能,该功能通过VC++6.0将用户输入的密码以星号形式回显,保护了密码的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



/******************
*功能:输入密码回显星号
*制作人:蒋睿立
*制作时间:2007年7月19日
*开发工具:VC++ 6.0
*全部是使用 C语言 
*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>


//主函数
void main()
{
        char password[20]="\0";  //存放密码的字符数组
        char c;                             //临时存放一个字符
        int i=0;                             //记数  
   
 
 /**当输入的字符不是回车时,就存放进password[i]
 *  当输入回车时,结束循环
 */
       while ((c=getch()) != '\r')
       {
               password[i] = c;
               i++;
               if(c!='\b')    //输入内容不是退格时就显示 “*”号
               {
                       printf("*");
               }
              else     //输入内容是退格时 删除前一个 “*”号
              {
                       printf("\b \b");
              }
       }


 


 //显示输入的密码
       printf("\n");
       for(i=0;i<20;i++)
       {
              printf("%c",password[i]);
        }
        system("pause");           //需要头文件stdlib.h支持


}


这是用C语言模拟一个密码框,输入的字符不是明文显示,而是用*代替。用VC++ 6.0编译通过
<think>好的,我现在需要在C语言中实现输入密码时显示星号的功能。用户提到可以参考引用[1]中的代码,我得仔细看一下。那个例子里的hidden_input函数用了getch来获取输入,然后处理退格键和显示星号。首先,我需要确定getch函数的使用方法,因为这在标准库中可能不可移植,可能需要conio.h或者类似的头文件,尤其是在Windows环境下。 然后,退格键的处理是关键。当用户按下退格键时,需要将光标回退,删除之前显示的星号,并且调整存储密码的数组。代码中检查input_char是否为'\b',如果是的话,判断index的位置。如果index>0,就执行退格操作,用putchar('\b')移动光标,再输出空格覆盖原来的星号,然后再退格一次,保持光标位置正确,同时减少index。这部分逻辑需要仔细处理,避免数组越界。 接下来是普通字符的处理,每输入一个字符就打印一个星号,同时将字符存入pwd数组,并递增index。循环直到遇到回车键'\r',这时候在数组末尾加上结束符'\0'。需要注意的是,不同系统的换行符可能不同,Windows是'\r\n',而Linux通常是'\n',所以可能需要根据环境调整判断条件。 另外,代码中用了fflush(stdin)来清除输入缓存,但根据C标准,fflush仅用于输出流,输入流的fflush行为是未定义的,可能在有些编译器上不起作用。可能需要寻找替代方法,比如循环读取直到缓冲区清空,或者使用其他方式确保输入缓冲区干净。 还有,密码存储的安全性也要注意,比如防止缓冲区溢出。需要确保输入的字符数不超过pwd数组的长度,或者在代码中加入长度检查,避免溢出。例如,当index达到数组大小时不再接受更多字符。 可能的问题:如果用户输入超过数组长度怎么办?原代码中没有处理这种情况,可能导致溢出。所以需要在输入字符时检查index是否小于数组的最大长度减一(因为要留位置给结束符)。例如,当输入字符时,只有index < max_length -1时才允许存入数组,否则忽略输入或发出提示。 此外,getch函数在非Windows平台可能需要自己实现,或者使用其他函数如getchar,但这样可能需要处理回显的问题。这可能影响代码的可移植性。如果用户是在Windows下开发,使用conio.h的getch是可行的,但在Linux下可能需要其他方法,比如使用termios库来控制终端设置,禁用回显。 总结步骤: 1. 使用getch逐个读取字符,不回显。 2. 处理普通字符:显示*,存入数组。 3. 处理退格键:删除前一个字符,调整光标和数组。 4. 处理回车键结束输入。 5. 添加结束符,确保字符串正确终止。 6. 处理输入长度限制,防止溢出。 现在需要把这些步骤转化为代码,并注意潜在的问题,比如缓冲区溢出、跨平台兼容性等。可能还需要测试不同情况下的退格操作,比如在密码为空时按退格是否出错,输入过长时的处理是否正确。 另外,用户提供的引用[1]中的代码在退格处理时有个条件判断:if(index <0) continue; 但index初始是0,输入退格时,如果index是0,可能不会执行任何操作,所以这个条件可能多余。比如当index=0时,用户按退格,此时index--会导致index变成-1,但原代码中在退格处理时会先检查index是否>0,所以当index=0时不会执行退格操作,因此index不会变成负数,所以原代码中的if(index <0)可能是冗余的,可以去掉。 最后,确保在输入结束后,数组正确终止,没有内存泄漏或越界访问。</think>在C语言控制台中实现密码输入显示星号(*)功能,可以通过以下步骤实现: ### 实现步骤 1. **使用`getch()`函数无回显输入** 需包含`conio.h`头文件(仅限Windows系统),通过循环读取单个字符实现无回显输入。 2. **处理退格键(Backspace)** 当检测到退格键`\b`时,需执行: - 光标左移一位 - 用空格覆盖原字符 - 光标再次左移一位 - 同时调整密码缓冲区索引 3. **添加字符串终止符** 输入结束时添加`\0`保证字符串合法性。 ```c #include <stdio.h> #include <conio.h> // Windows特有头文件 void get_password(char* pwd, int max_len) { char ch; int index = 0; while ((ch = getch()) != '\r') { // 回车键结束输入 if (ch == '\b') { // 退格键处理 if (index > 0) { printf("\b \b"); // 擦除星号 index--; } } else if (index < max_len - 1) { // 防溢出 printf("*"); pwd[index++] = ch; } } pwd[index] = '\0'; // 字符串终止符 } ``` ### 关键细节说明 1. **跨平台兼容性** `conio.h`是Windows特有库,Linux/macOS需使用`termios.h`实现类似效果[^1]。 2. **缓冲区溢出防护** `index < max_len -1`确保存储空间足够容纳终止符。 3. **退格键逻辑优化** 使用`printf("\b \b")`替代三次`putchar`调用,代码更简洁。 ### 使用示例 ```c int main() { char password[20]; printf("请输入密码:"); get_password(password, sizeof(password)); printf("\n实际密码:%s", password); return 0; } ``` ### 注意事项 - 输入过程中按`ESC`键终止等高级功能需扩展实现 - 建议结合`memset`清空敏感内存区域提升安全性
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值