这篇文章主要包含了各种字符串函数、内存函数的讲解,以及各类函数详细的模拟实现过程。
文章目录
字符串函数
1.strlen
strlen的功能
int main()
{
char str[20] = { 0 };
scanf("%s", str);//abcdef
int len = strlen(str);
printf("%d\n", len);//6
return 0;
}
用于求解字符串长度,返回类型为size_t。
strlen的模拟实现
//int my_strlen(char* str)
//{
// int count = 0;
// while (*str)
// {
// count++;
// str++;
// }
// return count;
//}
int my_strlen(char* str)
{
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
字符串总以’\0’为结束标志,strlen用于统计’\0’之前的字符个数并返回。注意区分strlen()与sizeof()的不同,strlen为字符串函数,统计字符个数,只能用于字符串;而sizeof为操作符,用于计算所占内存的大小。
一、长度不受限制的字符串函数
1.strcpy
strcpy的功能
int main()
{
char str1[] = "abcdef";
char str2[20];
strcpy(str2, str1);
printf("str2:%s\n", str2);//abcdef
return 0;
}
用于拷贝字符串,连同‘\0’一起拷贝。返回目的字符串的首地址
strcpy的模拟实现
char* my_strcpy(char* des, const char* src)
{
assert(des);
assert(src);
char* ret = des;
while (*des++ = *src++)
{
;
}
return ret;
}
2.strcat
strcat的功能
int main()
{
char str1[20];
char str2[20];
gets(str1);//hello
gets(str2);//world
printf("%s\n", strcat(str1, str2));//hello world
return 0;
}
用于追加字符串,将函数第一个参数的字符串的结束标志\0’修改,并在其后面进行追加。
strcat的模拟实现
char* my_strcat(char* des, const char* src)
{
int len = strlen(des);
char* end = des + len;
while (*end++=*src++)
{
;
}
return des;
}
3.strcmp
strcmp的功能
int main()
{
char str1[20];
char str2[20];
scanf("%s%s", str1, str2);//str1:abcd; str2:abdf
int ret = strcmp(str1, str2);
printf("%d\n", ret);//-1
return 0;
}
strcmp用于比较两个字符串,若两字符串相等,则返回1,若前一个字符串小于第二个字符串,则返回一个小于0的数字,否则,返回一个大于0的数字。
strcmp的模拟实现
int my_strcmp(char* str1, char* str2)
{
while (*str1 == *str2)
{
if (*str1 = '\0')
return 0;
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
return -1;
}
4.strstr
strstr的功能
int main()
{
char str1[20];
char str2[20];
scanf("%s%s", str1, str2);//str1:abcdef str2:cde
printf("%s\n", strstr(str1, str2));//cdef
return 0;
}
用于在一个字符串中查找一个子字符串,若能找到,则返回字符串中该子字符串的起始位置,否则,返回一个空指针。
strstr的模拟实现
char* my_strstr(const char* str1, const char* str2)
{
char* ps1 = str1;
char* ps2 = str2;
while (*str1 != '\0')
{
if (*str1 != *str2)
{
ps1++;
str1 = ps1;
str2 = ps2;
}
else
{
str1++;
str2++;
}
if (*str2 == '\0')
return ps1;
}
}
二、长度受限制的字符串函数
1.strncpy
strncpy的功能
int main()
{
char str1[20] = "abcdef";
char str2[20] = "******";
printf("%s\n", strncpy(str1, str2, 4));//****ef
return 0;
}
用于拷贝字符串,以字节为单位,从source中拷贝num个字节到destination,细节与上述strcpy相同。
2.strncat
strncat的功能
int main()
{
char str1[20] = "hello ";
char str2[20] = "world!!!!!";
//printf("%s\n", strncat(str1, str2, 5));//hello world
printf("%s\n", strncat(str1, str2, 7));//hello world!!
return 0;
}
用于追加字符串,以字节为单位,具体细节与strcat相同。
3.strncmp
strncmp的功能
int main()
{
char str1[20] = "abcdef";
char str2[20] = "abcdeg";
printf("%d\n", strncmp(str1, str2, 5));//0
printf("%d\n", strncmp(str1, str2, 6));//-1
return 0;
}
用于比较指定字节数内的字符串,具体细节与strcmp相同。
内存操作函数
1.memcpy
memcpy的功能
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr1, arr2, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);//0 0 0 0 0 6 7 8 9 10
}
return 0;
}
从source的位置开始向后复制num个字节的数据到destination的内存位置,遇到’\0’时,该函数也不会停止。
返回的是destination的地址
memcpy的模拟实现
void* my_memcpy(void* des, void* src, size_t num)
{
void* ret = des;
while (num)
{
*(char*)des = *(char*)src;
des = (char*)des + 1;
src = (char*)src + 1;
num--;
}
return ret;
}
2.memmove
memmove的功能
int main()
{
int arr[] = { 1,2,3,4,5,6,7 };
memmove(arr + 2, arr, 12);
//memmove(arr + 2, arr, 12);
int i = 0;
for (i = 0; i < 7; i++)
{
printf("%d ", arr[i]);//1 2 1 2 3 6 7
}
return 0;
}
memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
memmove的模拟实现
void* my_memmove(void* des, void* src, size_t num)
{
void* ret = des;
assert(des);
assert(src);
if (src < des)
{
while (num--)
{
*((char*)des + num) = *((char*)src + num);
}
}
else
{
while (num--)
{
*(char*)des = *(char*)src;
des = (char*)des + 1;
src = (char*)src + 1;
}
}
return ret;
}
3.memset
memset的功能
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
memset(arr1, 0, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);//0 0 0 0 0 6 7 8 9 10
}
return 0;
}
对内存块中的值进行指定字节的初始化
4.memcmp
memcpy的功能
int main()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n = memcmp(buffer1, buffer2, sizeof(buffer1));
printf("%d\n", n);//1
return 0;
}
对内存块中的内容进行比较,并返回一个整数。
返回比较的数值。
总结
这篇文章基本涵盖了字符串函数以及内存函数的所有知识,帮助自己理解归纳的同时也希望能够帮助一些小伙伴们!在看这篇文时,小伙伴们如果有不清楚的地方都可以私信问我。当然,如果有写得不对不好的地方,也希望大家能够帮忙斧正!