一、字符函数和字符串函数
1. 字符分类函数
C语⾔中有⼀系列的函数是专门做字符分类的,也就是⼀个字符是属于什么类型的字符的。
这些函数的使⽤都需要包含⼀个头⽂件是
ctype.h
。
![](https://img-blog.csdnimg.cn/direct/7d7a1c0c4fe048d48c55149e7ce2b823.png)
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
int main()
{
char c1 = 'a';
char c2 = 'A';
int ret1 = 0;
int ret2 = 0;
ret1 = isupper(c1);
ret2 = isupper(c2);
printf("a:%d\n", ret1);
printf("A:%d\n", ret2);
return 0;
}
#include<stdio.h>
#include<ctype.h>
int main()
{
char c1 = 'a';
char c2 = 'A';
int ret1 = 0;
int ret2 = 0;
ret1 = isupper(c1);
ret2 = isupper(c2);
printf("a:%d\n", ret1);
printf("A:%d\n", ret2);
return 0;
}
代码运行结果:
![](https://img-blog.csdnimg.cn/direct/79fb4acb07ea414db2733d7607d7b317.png)
使用isupper()函数(判断是否为大写字母)来举例,可以看出当为大写字母时函数返回一个大于0的数,当为小写字母时返回数字0。其他函数用法一致。
2. 字符转换函数
字符转换函数有两个toupper()
//将参数传进去的⼩写字⺟转⼤写
和tolower()
//将参数传进去的⼤写字⺟转⼩写
。这两个函数的使⽤也都需要包含头⽂件
ctype.h
。
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = 'a';
int ret = 0;
ch = toupper(ch);
printf("%c\n", ch);
return 0;
}
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = 'a';
int ret = 0;
ch = toupper(ch);
printf("%c\n", ch);
return 0;
}
上述这个代码就是大小写的‘a’,转化成大写的‘A’。tolower()用法类似。
3.strlen函数(
求字符串长度)
注意点:
1.字符串要以'/0'为结尾。
2.计算的是以传入地址为起点,'/0'前面的字符数。
3.
函数的返回值为size_t,是无符号的。
4.该函数要包含头文件
string.h
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int ret = 0;
char arr[] = "abcdef";
ret = strlen(arr);
printf("%d\n", ret);
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
int ret = 0;
char arr[] = "abcdef";
ret = strlen(arr);
printf("%d\n", ret);
return 0;
}
代码运行结果:
![](https://img-blog.csdnimg.cn/direct/1cd28c1bd9cf4b20accc07b63f518df4.png)
上面代码strlen(arr)这个就是向strlen函数传入arr的地址,arr为表示的是数组首元素的地址及是'a'的地址,由于字符串"abcdef"后面还有个'\0',所以计算的是从a到f的字符的数量总共有6个。
4.strcpy函数(
字符串拷贝)
注意点:
1.源字符串必须以 '\0' 结束。
2.会将源字符串中的 '\0' 拷⻉到⽬标空间。
3.⽬标空间必须⾜够⼤,以确保能存放源字符串。
4.⽬标空间必须可修改。
5.该函数要包含头文件
string.h
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[20] = "0";
strcpy(arr2, arr1);
printf("arr2:%s\n",arr2);
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[20] = "0";
strcpy(arr2, arr1);
printf("arr2:%s\n",arr2);
return 0;
}
代码运行结果:
![](https://img-blog.csdnimg.cn/direct/d5bb548bd42f4bcb950e3e365f9e7a96.png)
上述代码是将arr1的内容复制到arr2中,所以arr2复制了arr1中"abcdef"。
5.strcat函数(
在字符串后面追加字符串)
注意点:
1.源字符串必须以 '\0'
结束。
2.⽬标字符串中也得有 \0
,否则没办法知道追加从哪⾥开始。
3.⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
4.⽬标空间必须可修改。
5.该函数要包含头文件
string.h
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strcat(arr1, arr2) ;
printf("%s\n", arr1);
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strcat(arr1, arr2) ;
printf("%s\n", arr1);
return 0;
}
代码运行结果:
![](https://img-blog.csdnimg.cn/direct/b1196ecc2bb34ff0866f7bdbc2f9b3a7.png)
上述代码中
strcat(arr1, arr2)函数是在arr1后面追加arr2字符串。
6.strcmp函数
(
字符串比较
)
注意点:
1.
第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
2.第⼀个字符串等于第⼆个字符串,则返回0
3.第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abq";
char arr3[] = "abq";
int ret1 = 0;
int ret2 = 0;
int ret3 = 0;
ret1 = strcmp(arr1, arr2) ;
ret2 = strcmp(arr2, arr1) ;
ret3 = strcmp(arr2, arr3) ;
printf("arr1,arr2:%d\narr2,arr1:%d\narr2,arr3:%d\n", ret1, ret2, ret3);
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abq";
char arr3[] = "abq";
int ret1 = 0;
int ret2 = 0;
int ret3 = 0;
ret1 = strcmp(arr1, arr2) ;
ret2 = strcmp(arr2, arr1) ;
ret3 = strcmp(arr2, arr3) ;
printf("arr1,arr2:%d\narr2,arr1:%d\narr2,arr3:%d\n", ret1, ret2, ret3);
return 0;
}
代码运行结果:
![](https://img-blog.csdnimg.cn/direct/b125cbe96af04cd696f351dd1aec5d07.png)
上述代码
strcmp(arr1, arr2)arr1与arr2进行比较,由于'q'大于'c',所以字符串"abcdef"小于字符串"abq",返回小于0的数。而
strcmp(arr2, arr1)则返回大于0的数,在strcmp(arr2, arr3),由于arr1,arr2中的字符串一样返回0。
7.strncat、strncpy和strncmp
这三个函数的用法和上4、5、6函数类似,在函数后面多了一个参数用来指定追加几个字符串,复制几个字符串或比较几个字符串。
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[20] = "0";
strncpy(arr2, arr1, 3) ;
printf("arr2:%s\n",arr2);
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[20] = "0";
strncpy(arr2, arr1, 3) ;
printf("arr2:%s\n",arr2);
return 0;
}
代码运行结果:
![](https://img-blog.csdnimg.cn/direct/b4cc8930aeac463ea6067819fcf61710.png)
在上述代码中strncpy(arr2, arr1, 3),说明了在从arr1中复制了前3个字符串给arr2。另外两个函数用法类似。
8.strstr函数
(
在一个字符串中找另一个字符串
)
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
printf("%s\n", strstr("ababdefabd", "abd")) ;
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
printf("%s\n", strstr("ababdefabd", "abd")) ;
return 0;
}
代码运行结果:
![](https://img-blog.csdnimg.cn/direct/654a79ba517248a2aa3bfd3c94f13122.png)
上述代码中
strstr("ababdefabd", "abd")是在"ababdefabd"中找"abd",找到后返回"abd"在"ab
abd
efabd"第一次出现的位置。"abd"在"ababdefabd"第一次出现的地方是红色字体部分所以返回"
abd
efabd"中
a
的地址,strstr(arr1,arr2)就是在arr1里找arr2字符串,如果找到返回arr2在arr1第一次出现的位置。
二、内存函数
1. memcpy函数
(
内存拷贝
)
可以拷贝整形数据,字符数据结构体数据等等。
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 3 * sizeof(int));
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 3 * sizeof(int));
printf("arr2:");
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
代码运行结果:
![](https://img-blog.csdnimg.cn/direct/9dbf4fc229414c13ad1c4ac2fe78fa39.png)
上述代码中的
memcpy(arr2, arr1, 3 * sizeof(int))和strcpy类似,只是strcpy只能拷贝字符数据,而memcpy能拷贝任意类型数据,只是要自己指定拷贝多少字节数据。memcpy(arr2, arr1, 3 * sizeof(int))的意思就是把arr1中的前(
3 * sizeof(int))==12字节的数据拷贝到arr2中。
2.memmove函数
memmove函数和memcpy函数类似,区别就是,用memmove函数
处理的源内存块和⽬标内存块是可以重叠的。
3.memset函数
(
⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容
)
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "hello world!";
memset(arr, '#', 5);
printf("%s\n", arr);
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "hello world!";
memset(arr, '#', 5);
printf("%s\n", arr);
return 0;
}
代码运行结果:
![](https://img-blog.csdnimg.cn/direct/b6dd06847f8143e186fe8d734798e689.png)
上述代码中
memset(arr, '#', 5),将数组arr中的前5个字节的数据改成'#'。
4.memcmp函数
memcmp函数和strcmp函数类似,区别就是memcmp函数
只能比较字符数据,而memcmp函数能比较任意类型数据,只是要自己指定拷贝多少字节数据。