栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

自制 C++ 密码程序(第二代)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自制 C++ 密码程序(第二代)

自制 C++ 密码程序(第二代)

说明: 在第一代的基础上添加了一些功能
注意: 作者使用的是 linux 系统,windows和macos 用户直接编译可能会报错
某些地方是为 linux 准备的,如果你用windows系统,需根据注释修改
话不多说,上代码:

// 作者使用的是 linux 系统,windows和macos 用户直接编译可能会报错
#include 
#include 
#include 
#include 
// 以上头文件为 linux 获取字符的 getch() 准备
// 如果你是 windows 系统,那么改成:
// #include
// 由于作者不熟悉 macos 系统,所以没有关于 macos 的注释,macos 用户需自行琢磨
#include  // 检测键盘信号
#include  // C++必备头文件

using namespace std; // 命名空间std

// 初始化 (新)
std::string Word; // 定义字符串
char c = 0;		  // 定义字符

// 键盘错误 (新)
void err()
{
	std::cout << "rae[2K清重新输入:" << flush; // 响铃(主板蜂鸣器或系统播放声音)并清行并打印消息 (新)
	c = 0;										  // 清除字符 (新)
	Word = "";								  // 清除字符串 (新)
}

// Ctrl+C信号处理 (新)
void breakc(int sig)
{
	if (sig == SIGINT)
	{
		err(); // 键盘错误 (新)
	}
}

char getch() // linux 获取字符的 getch() ,windows 系统要直接删除这个函数
{
	//以下不是核心,我就少注释了
	char c = 0;
	struct termios org_opts, new_opts;
	int res = 0;
	//-----  store old settings -----------
	res = tcgetattr(STDIN_FILENO, &org_opts);
	assert(res == 0);
	//---- set new terminal parms --------
	memcpy(&new_opts, &org_opts, sizeof(new_opts));
	new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE | ICRNL);
	tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);
	c = getchar();
	//------  restore old settings ---------
	res = tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);
	assert(res == 0);
	// cout << (int)c << " , " << flush; // 测试编码
	return c;
}

std::string get() // //获取密码
{
	std::cout << "请输入:"; // 提示文字,可修改或删掉
	while (1)				// 循环
	{
		c = getch(); // windows系统可能要改为_getch()
		switch (c)	 //判断输入
		{
		case 4:									  // 获取Ctrl+D (新)
			std::cout << "rae[2K退出" << endl; // 打印信息
			exit(1);							  // 退出并返回1
			break;
		case 10:					   // 获取回车(linux中编码为10)
			if (Word.size())		   //字符串长度大于0
				std::cout << "  rn"; //输出"换行"
			return Word;			   //返回字符串并退出循环
			break;					   //退出判断
		case 127:					   // 获取退格(linux中编码为127)
			if (Word.size())
			{
				std::cout << "b b"; // 向左移动光标并删除屏幕上的一个字符串符号(替换成空格)
				Word.pop_back();	  // 删除字符串前一个字符
			}
			break;
		case 27:			   // (新) 获取 Esc,防止终端错误(Esc使用方法详情
							   // https://blog.csdn.net/linux_rm/article/details/124732456
			if (getch() == 91) // 获取'[' (新)
			{
				switch (getch()) // 再获取一次 (新)
				{
				case 65: //上 (新)
					std::cout << "a";
					break;
				case 66: //下 (新)
					std::cout << "a";
					break;
				case 67: //右 (新)
					std::cout << "a";
					break;
				case 68: //左 (新)
					std::cout << "a";
					break;
				default:
					err();
					break;
				}
			}
			else
			{
				err(); // 键盘错误(新)
			}
			break;
		default:				// 获取其他字符
			Word += c;			// 插入字符串
			cout << c << flush; // 显示字符,可修改或删掉(同时删掉 std::cout << "b b";)
			break;
		}
		c = 0;
	}
}

std::string out() // 输出时的动作 (新)
{
	std::string W = get();
	cout << "输入结果:"; // 打印信息
	return W;			 // 返回输入值(字符串)
}

int main(int argc, char const *argv[]) // 主函数
{
	signal(SIGINT, breakc); // Ctrl+C信号处理 (新)
	std::cout << out() << endl;
	return 0; // 正常时返回值为0
}

运行结果:
1234[Ctrl+C]abcd[退格]e[回车]
1234[Ctrl+D]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955458.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号