1.1 strlen
这个字符串函数就是统计字符串中'\0'之前的字符。
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "bacdef";
int ret = strlen(arr);
printf("%d", ret);
return 0;
}
注意:strlen的返回值是size_t 类型的,size_t指无符号整型,无法相加减。
模拟实现:
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str != '\0')
{
count++;
*str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
size_t ret = my_strlen(arr);
printf("%d", ret);
return 0;
}
1.2 strcpy
这个字符串函数就是将一个字符串‘\0’之前的数复制到另一个数组中。
使用方法:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10] = "xxxxxxx";
char arr2[] = "abcdef";
strcpy_s(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++)
;
return ret;
}
int main()
{
char arr1[] = "xxxxxxxx";
char arr2[] = "abcdefgh";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
1.3 strcat
这个字符串函数就是实现在原有字符串后面进行追加。
使用方法:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[20] = "hello ";
strcat_s(arr,"world");
printf("%s", arr);
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[20] = "hello ";
my_strcat(arr, "world");
printf("%s", arr);
return 0;
}
1.4 strcmp
这个函数就是比较两个字符串的阿斯克码值的大小
头文件: #include<string.h>
使用方法:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "zhangsan" ;
char arr2[] = "zhangsanfeng";
int ret = strcmp(arr1, arr2);
if (ret > 0)
printf(">");
else if (ret < 0)
printf("<");
else if (ret == 0)
printf("==");
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
*str1++;
*str2++;
}
return(*str1 - *str2);
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abcq";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
printf(">");
else if (ret == 0)
printf("==");
else if (ret < 0)
printf("<");
return 0;
}
strlen strcpy strcmp属于不受限制的字符串函数
长度受限制的字符串函数:
1.5 strncpy
此函数就是在strcpy的前提下追加了一个复制长度
使用方法:
#include<stdio.h>
int main()
{
char arr1[] = "abcde";
char arr2[] = "efgh";
strncpy(arr1, arr2, 5);
printf("%s", arr2);
return 0;
}
注意:如上图,如果arr2实际有4个字符但要求拷贝多于四个字符,则剩下字符由‘\0’代替。
1.6 strncat
此函数就是在strcat的前提下追加了一个复制长度
使用方法:
#include<stdio.h>
int main()
{
char arr1[20] = "abc";
char arr2[10] = "defg";
strncat(arr1, arr2, 7);
printf("%s", arr1);
return 0;
}
注意: 和上一个不同的是如果要求衔接字符不足,则不会补充‘\0’
1.7 strncmp
此函数就是在strcmp的前提下追加了一个复制长度
使用方法:
#include<stdio.h>
int main()
{
char arr1[] = "abcd";
char arr2[] = "abcq";
int ret=strncmp(arr1, arr2, 3);
if (ret > 0)
printf(">");
else if (ret == 0)
printf("==");
else if (ret < 0)
printf("<");
return 0;
}
1.8 strstr
这个字符串函数实际上是要求在一个全集中寻找子集字符串
使用方法:
#include<stdio.h>
int main()
{
char arr1[] = "www.2404868224@qq.com";
char arr2[] = "2404868224";
char* ret=strstr(arr1, arr2);
printf("%s", ret);
return 0;
}
但要注意,strstr实际上是寻找相同字符串并记录字符串首元素地址故会将相同首元素后的东西都打印出来。
并且打印时也需要使用char*类型。
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 =str1;
const char* s2 = str2;
const char* p = str1;
while(*p)
{
s1 = p;
s2 = str2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return p;
}
p++;
}
}
int main()
{
char arr1[] = "www.2404868224@qq.com";
char arr2[] = "2404868224";
char* ret=my_strstr(arr1, arr2);
printf("%s", ret);
return 0;
}
1.9 strtok
strtok字符串函数的作用就是切割字符串
注意:strtok字符串函数会改变原字符串,如果想要不改变,则需要另创造字符串。
使用方法:
#include<stdio.h>
int main()
{
char arr1[] = "www.2404868224@qq.com";
char arr2[] = ".@.";
char arr3[30] = { 0 };
strcpy(arr3, arr1);
char* ret1 = strtok(arr3, arr2);
printf("%s\n", ret1);
char* ret2 = strtok(NULL, arr2);
printf("%s\n", ret2);
char* ret3 = strtok(NULL, arr2);
printf("%s\n", ret3);
return 0;
}
or
#include<stdio.h>
int main()
{
char arr1[] = "www.2404868224@qq.com";
char arr2[] = ".@.";
char arr3[30] = { 0 };
strcpy(arr3, arr1);
char* ret = NULL;
for (ret = strtok(arr3, arr2); ret != NULL; ret = strtok(NULL, arr2))
{
printf("%s\n", ret);
}
return 0;
}
1.10 strerror
这个字符串函数就是库函数在执行失败时会打印错误码。
isspace函数是判断()中是否为空白字符的字符串函数。
1.11 memcpy
这个字符串函数就是内存拷贝和strncpy的区别是拷贝变量是按字节计算
使用方法:
记得要引用头文件#include<string.h>
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d", arr2[i]);
}
return 0;
}
模拟实现:
#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[20] = { 0 };
my_memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d", arr2[i]);
}
return 0;
}
1.12 memmove
memmove作用和memcpy作用大体一致,但memmove是实现重叠内存之间的内存拷贝的。
使用方法:
#include<stdio.h>
#include<string.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7 };
memmove(arr + 2, arr, 8);
int i = 0;
for (i = 0; i < 7; i++)
{
printf("%d", arr[i]);
}
return 0;
}
模拟实现:
因为要实现重叠内存的字符串拷贝,所以要考虑是从前往后拷贝还是从后往前拷贝,穷举法试出拷贝顺序列出上表。
#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(void* dest,const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
if (dest < src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
my_memmove(arr + 2, arr, 12);
int i = 0;
for (i = 0; i < 9; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
1.13 memcmp
跟strncmp用法大致相同,但str系列的字符串函数包括strncmp只能作用于字符串,而mem系列的函数包括memcmp能作用于任何数据。
1.14 memset
memset----memory set内存设置
使用方法:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "hello world";
memset(arr, 'x', 5);
printf("%s", arr);
return 0;
}