C++蓝桥杯基础篇(七)

片头

嗨~小伙伴们,大家好!今天我们来一起学习蓝桥杯基础篇(七),学习相关字符串的知识,准备好了吗?咱们开始咯!


一、字符与整数的联系——ASCII码

每个常用字符都对应一个-128~127的数字,二者之间可以相互转化:

int main() {
	char c = 'a';
	cout << (int)c << endl;

	int a = 66;
	cout << (char)a << endl;

	return 0;
}

打印结果为:

97

B

 常用的ASCII值:'A'~'Z'是65~90,'a'~'z'是97~122,'0'~'9'是48~57,字符可以参与运算,运算时会将其当做整数:

// 字符可以参与运算,运算时会将其当做整数
int main() {
	int a = 'B' - 'A';
	int b = 'A' * 'B';
	char c = 'A' + 2;

	cout << a << endl;
	cout << b << endl;
	cout << c << endl;

	return 0;
}

运行结果为:

1

4290

C

 练习:输入一行字符,统计出其中数字字符的个数,以及字母字符的个数

//练习: 输入一行字符,统计出其中数字字符的个数,以及字母字符的个数
int main() {
	char c;

	int num = 0;	//数字字符的个数
	int chars = 0;	//字母字符的个数

	while (cin >> c) {
		if (c >= '0' && c <= '9') num++;
		else if (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') chars++;
	}

	cout << "数字字符的个数为: " << num << endl;
	cout << "字母字符的个数为: " << chars << endl;

	return 0;
}

二、字符数组

字符串就是字符数组加上结束符'\0'。

可以使用字符串来初始化字符数组,但是要注意,每个字符串结尾会暗含一个'\0'字符,因此字符数组的长度至少要比字符串的长度多1!

int main() {
	char a1[] = { 'C','+','+' };		//没有'\0'
	char a2[] = { 'C','+','+','\0' };   //有'\0'
	char a3[] = "C++";					//自动添加表示字符串结尾的空字符'\0'

	//char a4[6] = "Daniel";//没有位置存放'\0',报错
	char a4[7] = "Daniel";  //正确写法

	cout << sizeof a1 << endl;  //3
	cout << sizeof a2 << endl;	//4
	cout << sizeof a3 << endl;	//4

	return 0;
}

如果我们想访问从字符数组的第2个位置开始,或者从中间位置开始,那么我们可以这样:

int main() {
	char a2[] = { 'A','B','C','D','\0' };
	char a3[] = "ABCDEF";

	cout << a2 + 1 << endl;		//BCD
	printf("%s\n", a3 + 2);		//CDEF

	return 0;
}

2.1  字符数组的输入输出
// 2.1 字符数组的输入输出

int main() {
	char str[100];
	char s[100];
	scanf("%s", s);		 //这里不能加&,数组名代表首元素的地址

	cin >> str;			 //输入字符串时,遇到空格或者回车就会停止
	cout << str << endl; //输出字符串时,遇到空格或者回车不会停止
	printf("%s\n", str);

	return 0;
}

读入一行字符串,包括空格

//读入一行字符串,包括空格
int main8() {
	char str[100];
	gets(str); 
    cout << str << endl;

	return 0;
}

 虽然用 gets() 时有空格也可以直接输入,但是 gets() 有一个非常大的缺陷,即它不检查预留存储区是否能够容纳实际输入的数据。

换句话说,如果输入的字符数目大于数组的长度,gets 无法检测到这个问题,就会发生内存越界,所以编程时建议使用 fgets()。

fgets()函数原型为:

char *fgets(char *s, int size, FILE *stream);

从stream流中读取size个字符存储到字符指针变量s所指向的内存空间

返回值为一个指针,指向字符串中第一个字符的地址

1.  s:代表要保存到内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名

2. size:代表的是读取字符串的长度

3. stream:表示从何种流中读取,可以是标准输入流stdin,也可以是文件流

 因此,我们可以使用fgets()来帮助我们读取字符串

int main() {
    char str[100];

    //从输入流stdin中最多读取100个字符到字符数组str中。
    //除去末尾的字符串结束符,实际上最多读取99个字符
    //fgets函数可以读取到空格和'\n'

	fgets(str, 100, stdin);
	cout << str << endl;

	return 0;
}

我们还可以使用cin来读取string类型的字符串,cin输入接触到第一个非空格字符时开始阅读,当遇到下一个字符(空格、制表符、换行符)时,就会停止读取

int main() {
	string s;
	printf("输入:\n");
	cin >> s;
	printf("输出:\n");
	cout << s;

	return 0;
}

 为了避免cin对于空白符的忽略问题,我们可以使用getline函数,getline函数可以读取整行,包括前面和中间的空格,并将其存储在字符串对象中,在输入时,直至遇到'\n'或EOF,才终止一行字符串的输入操作。

getline()函数有4种重载形式,这里我们先介绍1种,后续慢慢讲解

istream& getline(istream& is, string& str);

读取的istream是作为参数 is 传进函数的,读取的字符串保存在string类型的str中。

is : 表示一个输入流,例如cin。

str : 为string类型的引用,用来存储输入流中的流信息。

因此,我们可以使用getline()函数来读取字符串

int main() {
	string s;
	getline(cin, s);
	cout << s << endl;

	return 0;
}

2.2  字符数组的常用操作

下面几个函数需要引入头文件 #include<string.h>

(1)strlen(str),求字符串的长度

(2)strcmp(a,b),比较2个字符串的大小,a<b返回-1,a==b返回0,a>b返回1。这里的比较方式就是字典序!

(3)strcpy(a,b),将字符串b复制给从a开始的字符数组

下面我们依次来介绍这些函数

①strlen(str),求字符串的长度

// (1)strlen(str),求字符串的长度
int main() {
	char a[100] = "hello world!";

	cout << strlen(a) << endl; // 12
	return 0;
}

②strcmp(a,b),比较2个字符串的大小

// (2)strcmp(a,b),比较2个字符串的大小,
//		a<b时,返回-1;a==b时,返回0;a>b时,返回1

int main() {
	char s1[100], s2[100];
	scanf("%s%s", s1, s2);             //scanf函数的%s,会自动忽略空格,换行,Tab键
	cout << strcmp(s1, s2) << endl;

	return 0;
}

或者

int main() {
	char s1[100];
	scanf("%s", s1);
	cout << strcmp(s1, "abc") << endl;//将s1字符数组里面的内容和"abc"进行比较

	return 0;
}

③strcpy(a,b),将字符串b复制给从a开始的字符数组

// (3)strcpy(a,b),将字符串b复制给从a开始的字符数组
int main() {
	char s1[100], s2[100];
	scanf("%s", s1);
	strcpy(s2, s1);
	cout << s2 << endl;

	return 0;
}

2.3  遍历字符数组中的字符

遍历数组,当然采用for循环了,while循环也可以

//2.3 遍历字符数组中的字符

int main() {
	char a[100] = "hello world!";
	for (int i = 0; i < strlen(a); i++) {
		cout << a[i] << endl;
	}

	return 0;
}

这种方法行是行,但是每次都要计算strlen(a),花费了很多时间,有没有更省时的方法?

肯定有!把strlen(a)的结果存放在临时变量里面不就可以了~

int main() {
	char s1[100];
	scanf("%s", s1);
	for (int i = 0, len = strlen(s1); i < len; i++)  //将strlen(s1)的结果保存到len中
    {
		cout << s1[i] << endl;
	}
	return 0;
}

当然了,我们还可以在外面写:

int main() {
	char s1[100];
	scanf("%s", s1);
    
    int len = strlen(s1);
	for (int i = 0; i < len; i++) {
		cout << s1[i] << endl;
	}
	return 0;
}

练习1:只出现1次的字符

给定一个只包含小写字母的字符串,请你找出第一个仅出现一次的字符。如果没有,输出"no"。

思路:

①我们可以先定义str数组,用来读取输入的字符串,str数组长度可能会很大很大,所以定义为全局变量。

②再定义num数组,用来统计每个字母出现的次数,字母总数26个,因此,num数组长度为26。下标从0~25.,下标为0表示'a'出现的次数,下标为1表示'b'出现的次数....(相当于num数组是26个字母的映射)

③如何统计每个字母出现的次数呢?很简单,’a'的ASCII码值为97,对应num数组下标为0的位置,'a'出现的次数  = num数组下标为0位置的值;每当'a'出现1次,num[0]++;所以,表达式应为 num[str[i]-'a']

④当num数组出现任一下标的值为1的情况,即num[str[i]-'a'] == 1时,就是仅出现一次的字符。我们只需输出这个字符即可,即str[i],并且终止循环。

⑤如果num数组没有上面④这种情况,输出"no"

本道题代码如下:

//练习1:给定一个只包含小写字母的字符串,
//请找出第一个仅出现1次的字符。
//如果没有,输出"no"

int num[26] = { 0 };
char str[10010];

int main() {
	cin >> str;
	int len = strlen(str);

	for (int i = 0; i < len; i++) {
		num[str[i] - 'a']++;
	}

	for (int i = 0; i < len; i++) {
		if (num[str[i] - 'a'] == 1) {
			cout << str[i] << endl;
			return 0; //直接main函数结束,无需执行后续代码
		}
	}

	cout<<"no"<<endl;//如果没找到,输出"no"

	return 0;
}

第二个for循环也可以这样写:

	for (int j = 0; j < 26; j++) {
		if (num[j] == 1) //如果num数组对应下标位置的值为1
		{
			cout << char(j + 'a') << endl;//输出该字符,强转成char类型
			return 0;
		}
	}

练习2:替换字符

把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串

这道题,比较简单。代码如下:

//练习2:把一个字符串中特定的字符全部用给定的字符替换
//得到一个新的字符串

int main() {
	char str[31] = { 0 };
	scanf("%s", str); //scanf函数的%s,会自动忽略空格,换行,Tab键

	char c;
	scanf("\n%c", &c); //scanf函数的%c,任何数据都会被当作一个字符
					   //不管是数字还是空格、回车、Tab键它都会取回

	for (int i = 0; str[i]; i++) {
		if (str[i] == c) {
			str[i] = '#';
		}
	}
	puts(str);

	return 0;
}

 也可以使用下面这种方法:

int main() {
	char str[31] = { 0 };
	cin >> str;	//用cin也可以
	int len = strlen(str);//strlen函数的参数类型是char*

	char c;
	cin >> c;
	for (int i = 0; i < len; i++) {
		if (str[i] == c) {
			str[i] = '#';
		}
	}
	cout << str << endl; //使用cout也可以
	return 0;
}

三、标准库类型  string

可变长的字符序列,比字符数组更加好用,需要引入头文件:#include<string>

3.1  定义和初始化
//3.1 定义和初始化
int main() {
	string s1;		    //默认初始化,s1是一个空字符串
	string s2 = s1;		//s2是s1的副本
	string s3 = "hiya";	//s3是该字符串字面值的副本
	string s4(10, 'c');	//s4的内容是 cccccccccc

	return 0;
}
3.2  string上的操作

(1)string的读写

//3.2 string上的操作
//(1)string的读写

int main() {
	string s1, s2;

	cin >> s1 >> s2;
	cout << s1 << s2 << endl;

	return 0;
}

注意:不能用printf直接输出string,需要写成:printf("%s",s.c_str());

(2)使用getline读取一整行

//(2)使用getline读取一整行

int main() {
	string s;
	getline(cin, s);
	cout << s << endl;

	return 0;
}

(3)string 的 empty 和 size 操作(注意 size 是无符号整数,因此 s.size() <= -1 一定成立):

//(3)string的empty和size操作(注意:size是无符号整数,因此s.size()<=-1一定成立):

int main() {
	string s1, s2 = "abc";
	cout << s1.empty() << endl;  // 1
	cout << s2.empty() << endl;  // 0

	cout << s2.size() << endl;   // 3

	return 0;
}

(4)string 的比较

支持 > < >= <= == != 等所有比较操作,按字典序进行比较

(5)为string对象赋值:

int main() {
	string s1(10, 'c'), s2; //s1 的内容是cccccccccc;s2是一个空字符串
	s1 = s2;				//赋值:用s2的副本替换s1的副本
							//此时s1和s2都是空字符串
	return 0;
}

(6)两个string对象相加:

//2个string对象相加

int main() {
	string s1 = "abc", s2 = "def";
	string s3 = s1 + s2; //abcdef

	s3 += s1 + s2;      //abcdefabcdef
	cout << s3 << endl;
	return 0;
}

(7)字面值和string对象相加:

做加法运算时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来:

	string s1 = "hello", s2 = "world";
	string s3 = s1 + "," + s2 + '!';
	cout << s3 << endl; //hello,world!

当把string对象和字符字面值及字符串字面值混再一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string:

	string s4 = s1 + ",";		     //正确: 把一个string对象和有一个字面值相加

	//string s5 = "hello" + ",";     //错误: 两个运算对象都不是string,
								     //本质上是2个const char*类型的指针相加
								     //2个都是字符串常量,肯定是不能改变,不能进行相加

	string s6 = s1 + "," + "world";    //正确: 每个加法运算都有一个运算符是string
								       //如果从左到右,有一个string类型的,后面才会隐式类型转换
								   
	//string s7 = "hello" + "," + s2;  //错误: 不能把字面值直接相加,运算是从左到右进行的
									   //从左到右,先是"hello"+","相加,所以不会有隐式类型转换

 3.3  处理string对象中的字符

可以将string对象当成字符数组来处理

//3.3 处理string对象中的字符
//可以将string对象当成字符数组来处理

int main() {
	string s = "hello world";

	for (int i = 0; i < s.size(); i++) {
		cout << s[i] << " ";
	}
	cout << endl;

	return 0;
}

或者使用基于范围的for语句 

int main() {
	string s = "hello world";

	//范围for
	//把字符串s里面的值依次赋给e
	for (auto e : s) {
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

 如果我们想改变字符串s里面的值,需要在范围for里面传递引用&

int main() {
    string s = "hello world";
    for (char& c : s) {
		c = 'a';
	}
	cout << s << endl; //aaaaaaaaaaa

    return 0;
}

 练习3:信息加密

密码翻译,输入一个只包含小写字母的字符串,将其中的每个字母替换成它的后继字母,如果原字母是'z',则替换成'a'

emmm,咱们还是来画个图~

OK啦!本道题的代码如下:

//信息加密
int main() {
	string s;
	getline(cin, s); //如果用cin,遇到空格,会停止读取
					 //使用getline函数,读取一整行

	int len = s.size(); //求字符串的长度
	for (int i = 0; i < len; i++) {
		if (s[i] >= 'a' && s[i] <= 'z') {
			s[i] = 'a' + (s[i] - 'a' + 1) % 26;
		}
		else if (s[i] >= 'A' && s[i] <= 'Z') {
			s[i] = 'A' + (s[i] - 'A' + 1) % 26;
		}
	}

	cout << s << endl;
	return 0;
}

我们还可以使用范围for来优化代码:

int main() {
	string s;
	getline(cin, s); //如果用cin,遇到空格,会停止读取
					 //使用getline函数,读取一整行

	//这里要修改字符串s里面的值,必须传引用&
	for (auto& e : s) {
		if (e >= 'a' && e <= 'z') {
			e = 'a' + (e - 'a' + 1) % 26;
		}
		else if (e >= 'A' && e <= 'Z') {
			e = 'A' + (e - 'A' + 1) % 26;
		}
	}

	cout << s << endl;
	return 0;
}

练习4:字符串长度

其实这道题,就相当于让我们模拟实现strlen函数。

代码如下:

//求字符串长度
int main() {
	char s1[100] = { 0 };
	fgets(s1, 100, stdin);//只能用fgets函数,从标准库中最多读取100个字符存入s1中;直到遇见'\n'为止
						  //并且fgets函数会读取空格和'\n'

	//scanf("%s", s1);    //不能用scanf函数,因为scanf遇到空格或者换行,停止读取
	//cin >> s1;	      //不能用cin,因为cin遇到空格或者换行,停止读取

	int len = 0;

	//当元素值不是'\0'并且不是'\n',才计入字符串的长度
	for (int i = 0; s1[i] != '\0' && s1[i] != '\n'; i++) 
	{
		len++;
	}

	cout << len << endl; 
    //没有加上s1[i] != '\n'的判断条件时,写成 cout << len-1 << endl; 也可以
	
	return 0;
}

方法二:

int main() {
	string str;
	getline(cin, str);  //使用getline函数读取一整行
	cout << str.size() << endl;//调用size()函数
	
	return 0;
}

片尾

今天我们学习了字符串相关知识点,希望这篇文章对友友们有所帮助!!!

求点赞收藏加关注!!!

谢谢大家!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

显式 GC 的使用:留与去,如何选择?

目录 一、什么是显式 GC&#xff1f; &#xff08;一&#xff09; 垃圾回收的基本原理 &#xff08;二&#xff09;显式 GC 方法和行为 1. System.gc() 方法 2. 显式 GC 的行为 &#xff08;三&#xff09;显式 GC 的使用场景与风险 1. JVM 如何处理显式 GC 2. 显式 GC…

2025.03.03(第一天)

1、常见的高危端口号有哪些&#xff0c;并涉及到哪些攻击方式 端口号服务常见攻击方式21FTP匿名登录、文件上传漏洞22SSH暴力破解、密钥泄露、中间人攻击53DNSDNS劫持、DNS缓存投毒、DDoS放大攻击80/443HTTP/HTTPSSQL注入1433MSSQL暴力破解、SQL注入、远程代码执行3306MySQLSQ…

MySQL数据库基本概念

目录 什么是数据库 从软件角度出发 从网络角度出发 MySQL数据库的client端和sever端进程 mysql的client端进程连接sever端进程 mysql配置文件 MySql存储引擎 MySQL的sql语句的分类 数据库 库的操作 创建数据库 不同校验规则对查询的数据的影响 不区分大小写 区…

确保移动设备上机器学习的安全性:挑战与最佳实践

随着企业不断推出更智能、个性化且响应迅速的体验&#xff0c;AI处理能力在移动设备中的普及&#xff0c;促使了机器学习&#xff08;ML&#xff09;本地集成的应用和SDK的快速发展。2024年谷歌I/O大会报告中强调了这一趋势&#xff0c;谷歌鼓励开发者在移动应用中使用本地机器…

【Mac】2025-MacOS系统下常用的开发环境配置

早期版本的一个环境搭建参考 1、brew Mac自带终端运行&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Installation successful!成功后运行三行命令后更新环境&#xff08;xxx是mac的username&a…

计算机毕业设计SpringBoot+Vue.js美食推荐系统商城(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【Linux网络#14】:数据链路层(以太网 局域网通信 ARP协议 ARP 欺骗 DDos 攻击)

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活总是不会一帆风顺&#x…

001-码云操作

码云操作 一、配置公钥1.官网地址1.进入 git bash2.查看生成的公钥3.设置到 Gitee4.测试 二、初始化一个项目1.新建仓库 一、配置公钥 方便后续提交代码不用填写密码 1.官网地址 官网地址&#xff1a;https://gitee.com/Git码云教程&#xff1a;https://gitee.com/help/arti…

Android 获取jks的SHA1值:java.io.IOException: Invalid keystore format

命令生成 keytool -list -v -keystore 全路径.jks -alias 别名 -storepass 密码 -keypass 密码 1、遇到 的问题&#xff1a; 通过快捷键 ‘win r’ 启动的小黑框运行上面的命令会出现下面这个错误keytool 错误: java.io.IOException: Invalid keystore format 2、解决问题 …

项目准备(flask+pyhon+MachineLearning)- 1

目录 这是一篇学习笔记 1. 搭建项目 2.前期准备工作 3.创建用户(user)模板 这是一篇学习笔记 目的&#xff1a;用flask快速实现发布有关机器学习的项目&#xff0c;掌握flask框架&#xff0c;机器学习模型的存储和调用。 1. 搭建项目 使用pycharm创建项目&#xff0c;fl…

DeepSeek开源周Day5: 3FS存储系统与AI数据处理新标杆

项目地址&#xff1a; GitHub - deepseek-ai/3FS: A high-performance distributed file system designed to address the challenges of AI training and inference workloads.GitHub - deepseek-ai/smallpond: A lightweight data processing framework built on DuckDB and…

火语言RPA--PDF提取图片

【组件功能】&#xff1a;提取PDF文档指定位置图片 配置预览 配置说明 文件路径 支持T或# 默认FLOW输入项 待提取图片的PDF文件的完整路径。 提取位置 全部、指定页、指定范围3种位置供选择。 PDF文件密码 支持T或# 打开PDF文件的密码。 页码 支持T或# 提取指定页的页…

专业便捷PDF软件,即开即用

PDF文件因其小巧的体积、便捷的分享与存储方式&#xff0c;以及卓越的安全性&#xff0c;已成为学习、企业及各类机构中不可或缺的文件格式。无论是在学术研究、课程资料、商业报告还是合同文件中&#xff0c;PDF都能有效保持原有的格式和布局&#xff0c;确保内容在不同设备和…

LLVM - 编译器前端 - 学习将源文件转换为抽象语法树(二)

一:处理消息 在一个庞大的软件(比如编译器)中,我们不希望将消息字符串分散在各个地方。如果需要修改消息内容或将其翻译成另一种语言,最好将它们集中存放在一个地方!目前缺少的是对消息的集中定义。下面我们看看来如何实现它。 一种简单的方法是,每条消息都有一个 ID(一…

windows安装vue

1、下载nodejs安装包 https://nodejs.cn/download/ 2、安装node 中途记得可以自己改安装路径&#xff0c;其他都是下一步 3、安装完成后检查 node -v &#xff1a;查看nodejs的版本 npm -v &#xff1a;查看npm的版本 4、修改npm默认安装目录与缓存日志目录的位置 在nodejs目…

PyCharm接入本地部署DeepSeek 实现AI编程!【支持windows与linux】

今天尝试在pycharm上接入了本地部署的deepseek&#xff0c;实现了AI编程&#xff0c;体验还是很棒的。下面详细叙述整个安装过程。 本次搭建的框架组合是 DeepSeek-r1:1.5b/7b Pycharm专业版或者社区版 Proxy AI&#xff08;CodeGPT&#xff09; 首先了解不同版本的deepsee…

注意力机制详解笔记 Attention is all I donot understand!

注意力机制好奇了太久&#xff0c;QKV知道是什么但是一直没搞懂为什么&#xff0c;这段时间终于眼一闭心一横摁头看了一天视频&#xff0c;3B1B大佬太强了&#xff01;基于GPT看了三个视频&#xff0c;基本讲的toy model&#xff0c;没有讲“硬核”的如何训练和码代码&#xff…

腾讯云对象存储服务(COS)

腾讯云对象存储服务&#xff08;COS&#xff09; 安全、可扩展、低成本的云存储解决方案 腾讯云 对象存储服务&#xff08;COS&#xff0c;Cloud Object Storage&#xff09; 是一种高可靠、高性能、可扩展的云存储服务&#xff0c;专为海量非结构化数据&#xff08;如图片、…

Linux下安装VS Code

Centos 7 https://blog.csdn.net/weixin_63790642/article/details/132927888 安装存储库 sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc密钥 sudo sh -c echo -e "[code]\nnameVisual Studio Code\nbaseurlhttps://packages.microsoft.com/yum…

win32汇编环境,窗口程序中使控件子类化的示例一

;运行效果 ;win32汇编环境,窗口程序中使编辑框控件子类化的示例一 ;窗口子类化&#xff0c;就是把某种控件&#xff0c;自已再打造一遍&#xff0c;加入自已的功能。比如弄个特殊形状的按钮&#xff0c;或只能输入特殊字符的编辑框 ;当然&#xff0c;一般来说&#xff0c;这都是…