一.字符串函数
1.strlen函数
函数原型:size_t strlen(const char* str)
功能:统计str字符串的长度。统计的是字符串中\0之前字符的个数。
头文件:<string.h>
返回值:返回了str指向的字符串的长度。
2.strcpy函数
函数原型:char* strcpy(char* dest,const char* src)
函数功能:字符串拷贝,拷贝到源字符串的\0为止。
参数:dest - 指针,指向目的地空间,指向源头数据。
返回值:strcpy返回的是目表空间的起始地址。
头文件 - <string.h>
代码演示:
#include <stdio.h>
#include <string.h>
int main(void)
{
// 定义源字符串(要复制的内容)
char src[] = "Hello C Language";
// 目标字符数组,空间必须大于等于源字符串长度+1(存放结束符'\0')
char dest[50];
// strcpy(目标地址, 源地址):把src完整复制到dest,包含末尾'\0'
strcpy(dest, src);
printf("源字符串:%s\n", src);
printf("复制后目标字符串:%s\n", dest);
return 0;
}
3.strcat函数
函数原型: const* stract(char* dest,const char* src)
函数功能:字符串拼接,把src指向的源字符串的所有字符拼接到dest指向的空间中。
参数 :dest - 指针,只想目的地空间。 src - 指针,指向源头数据。
返回值:strcat 函数返回的目标空间的起始地址。
头文件<string.h>
头文件:<string.h>
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello, "; // 目标字符串
char src[] = "World!"; // 待拼接的源字符串
printf("拼接前dest:%s\n", dest);
// strcat(目标字符串, 源字符串)
strcat(dest, src);
printf("拼接后dest:%s\n", dest);
return 0;
}
4.strcmp函数
函数原型:int strcmp ( const char * str1, const char * str2 )
功能:用来比较str1 和str2 指向的字符串,从两个字符串的第一个字符开始比较,如果两个字符
的ASCII码值相等,就比较下一个字符。直到遇到不相等的两个字符,或者字符串结束。
参数
参数:str1-指针,指向要比较的第一个字符串。str2指针,只想要比较的第二个字符串。
#include <stdio.h>
#include <string.h> // strcmp头文件
int main()
{
char str1[] = "abc";
char str2[] = "abd";
char str3[] = "abc";
char str4[] = "ab";
/*
strcmp规则:
1. 两个字符串逐字符比较ASCII值
2. 相等返回0;str1>str2返回正数;str1<str2返回负数
*/
int res1 = strcmp(str1, str2);
int res2 = strcmp(str1, str3);
int res3 = strcmp(str4, str1);
printf("abc vs abd 结果:%d\n", res1); // c < d,负数
printf("abc vs abc 结果:%d\n", res2); // 完全相等,0
printf("ab vs abc 结果:%d\n", res3); // 短字符串更小,负数
return 0;
}
5.strncpy,stncmp,strncat
具体作用和前三者没什么区别,就是后面加了一个num来限制字节数,使用起来更加安全,这里就不一一赘述了。
二.内存函数
1.memcpy函数
函数原型:void* memcpy(void* dest,const void* src,size_t num)
函数功能:memcpy只负责完成存储拷贝,不关注内存数据存放的类型,函数memcpy从src开始向后复制num个字节到dest指向的位置上。
参数:dest - 指针,指向目标空间,拷贝的数据存放在这里。
src - 指针,指向源空间,要拷贝的数据从这里来。
num - 要拷贝的数据占用的字节数。
头文件:<string.h>
#include <stdio.h>
#include <string.h>
int main()
{
// 源数组
int src[5] = { 10,20,30,40,50 };
// 目标数组,初始全0
int dest[5] = { 0 };
// 参数:目标地址,源地址,拷贝字节总数
// int占4字节,拷贝3个int:3 * sizeof(int)
memcpy(dest, src, 3 * sizeof(int));
printf("拷贝后dest数组:");
for (int i = 0; i < 5; i++)
{
printf("%d ", dest[i]);
}
// 输出:10 20 30 0 0
return 0;
}
2.memmove函数
函数原型:void* memmove(void* dest,const* src,size_t num)
函数功能:和memmcpy一样,memmove也是用来完成内存拷贝的函数,只不过它的原内存和目标内存是可以重叠的。
参数: dest - 指针,指向目标空间,拷贝的数据存放在这里。
src - 指针,指向源空间,要拷贝的数据从这里来。
num - 要拷贝的数据占的字节数。
头文件:<string.h>
#include <stdio.h>
#include <string.h>
int main()
{
// 源数组,存在内存重叠场景
char buf[] = "123456789";
printf("移动前:%s\n", buf);
// 场景1:无重叠复制
char dest[20] = { 0 };
memmove(dest, buf, 5); // 把buf前5字节复制到dest
printf("无重叠复制结果:%s\n", dest);
// 场景2:内存重叠(源地址 < 目标地址,向后覆盖)
memmove(buf + 2, buf, 5); // 从buf[0]复制5字节到buf[2]
printf("重叠后:%s\n", buf);
return 0;
}
三.memset函数
函数原型: void * memset ( void * ptr, int value, size_t num )
函数功能:用来设定内存块内容,将内存中指定长度的空间设置为特定的内容。
参数:ptr - 指针,只向要设置的内存空间,也就是要放置内存空间的起始地址。
value - 填充的字节值。 num - 填充字节个数。
头文件: <string.h>
#include <stdio.h>
#include <string.h> // memset头文件
int main()
{
// 1.char数组演示
char str[10];
// 参数1:内存起始地址;参数2:填充字节值;参数3:填充字节总数
memset(str, 0, sizeof(str));
printf("char数组第一个值:%d\n", str[0]); // 输出0,全部清零
// 2.int数组清零
int arr[5] = { 1,2,3,4,5 };
memset(arr, 0, sizeof(arr));
printf("int数组第一个值:%d\n", arr[0]); // 输出0
// 3.踩坑示例:int数组填1,结果不是1
int num[2];
memset(num, 1, sizeof(num));
printf("错误赋值num[0] = %d\n", num[0]); // 输出16843009,每个字节0x01拼接
// 4.填充0xff(字节全1)
short test[2];
memset(test, 0xff, sizeof(test));
printf("全1短整型:%d\n", test[0]); // 输出-1
return 0;
四.memcmp函数
函数原型 : int memcmp ( const void * ptr1, const void * ptr2, size_t num )
函数功能:比较指定的两块内存块的内容,比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。
参数:ptr1 :指针,指向一块待比较的内存块
ptr2 :指针,指向另外一块待比较的内存块
num :指定的比较长度,单位是字节
头文件:<string.h>
#include <stdio.h>
#include <string.h> // memcmp头文件
int main()
{
// 两组字符串缓冲区
char buf1[] = "apple123";
char buf2[] = "apple456";
// 比较前5个字节 "apple",内容一致返回0
int res1 = memcmp(buf1, buf2, 5);
printf("前5字节比较结果:%d\n", res1);
// 比较全部字节,第6位'1' < '4',返回负数
int res2 = memcmp(buf1, buf2, sizeof(buf1));
printf("全部字节比较结果:%d\n", res2);
// 整数数组测试,memcmp只对比内存字节
int num1[] = { 1, 2, 3 };
int num2[] = { 1, 2, 3 };
int res3 = memcmp(num1, num2, sizeof(num1));
printf("整型数组对比结果:%d\n", res3);
return 0;
}
如果有错误的地方,欢迎大家指正!