目录
一.strlen
1.strlen的函数声明
size_t strlen(const char *str);
2.strlen函数的头文件
#include <string.h>
3.strlen函数的使用
strlen函数时测量字符串长度的函数(不包括'\0')
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdef";
int len = strlen(arr);
printf("%d\n", len);
return 0;
}
4.my_strlen函数的实现
strlen是计算一个字符串的长度,也就是字符数量,那么我们自己实现的my_strlen也遵循库函数的功能即可。
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str)
{
int count = 0;
assert(*str != NULL);//判断传进来的指针是否有效
while (*str++)//当*str = '\0'的时候条件为假
{ // '\0'的ASCLL码值为0
count++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
二.strcpy
1.strcpy函数的函数声明
char *strcpy( char *to, const char *from );
2.strcpy函数的头文件
#include <string.h>
3.strcpy函数的使用
strcpy函数是将一个字符串的全部内容(包括'\0')拷贝到另一个字符串里。
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "bit";
strcpy(arr1, arr2);//字符串拷贝
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
4.my_strcpy函数的实现
strcpy函数是字符串拷贝,传入的第一个字符串是接收拷贝的字符串,第二个字符串是要被拷贝的字符串,我们不需要保护第一个字符串,但是我们不希望第二个字符串被修改,所以在第二个传参的时候加上const。
assert是断言,判断传入的字符串是否合法(是否不为空指针),如果是空指针则进行报错
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* str)
{
assert(*dest != NULL);
assert(*str != NULL);
char* ret = dest;
//拷贝str指向的字符串到dest指向的空间,包含'\0'
while (*dest++ = *str++)
{
;
}
//返回目的空间的起始地址
return ret;
}
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "bit";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
三.strcat
1.strcat函数的函数声明
char *strcat(char *_Destination,const char *_Source);
2.strcat函数的头文件
#include <string.h>
3.strcat函数的使用
strcat函数是字符串追加函数,也就是在英国字符串后面追加另一个字符串。
比如在“hello”后面追加一段“world”就可以用strcat函数来实现
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[30] = "hello";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);//追加字符串
return 0;
}
结果打印出来就是 helloworld
4.my_strcat函数的实现
之前我们提到了,strcat函数是字符串追加函数,我们在自己实现的时候就需要提前找到被追加的字符串的尾部,也就是找到'\0'。
那么被追加的字符串是可以被改动的,而追加过去的字符串我们就不希望被修改,所以传进去的第一个字符串不需要加const,而第二个字符串需要加const
(assert是断言,判断传进去的字符串是否合法)。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* dest, const char* str)
{
char* ret = dest;
assert(*dest != NULL);
assert(*str);
//找到目的字符串里的'\0'
while (*dest != '\0')
{
dest++;
}
//追加
while (*dest++ = *str++)
{
;
}
return ret;
}
int main()
{
char arr1[30] = "hello";
char arr2[] = "world";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
四.strstr
1.strstr函数的函数声明
extern char *strstr(char *str1, const char *str2);
2.strstr函数的头文件
#include <string.h>
3.strstr函数的使用
第一个参数是被查找的字符串,第二个参数是需要在字符串里查找到的字符串,也就是说strstr函数的作用就是:在一个字符串里查找是否存在另一个字符串 ,如果存在则返回找到该字符串的起始地址,如果不存在则返回空(NULL)。
int main()
{
char p1[] = "abbbcdef";
char p2[] = "bbc";
char* ret = strstr(p1, p2);
printf("%s\n", ret);
return 0;
}
4.my_strstr函数的实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strstr(const char* p1, const char* p2)
{
assert(p1 != NULL);
assert(p2 != NULL);
char* s1;
char* s2;
char* cur = (char*)p1;
if (*p2 == '\0')
return (char*)p1;
while (*p1)
{
s1 = cur;
s2 = (char*)p2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;
}
cur++;
}
return NULL;
}
int main()
{
char p1[] = "abbbcdef";
char p2[] = "bbc";
char* len = my_strstr(p1, p2);
printf("%s\n", len);
return 0;
}
五.memcpy
1.memcpy函数的函数声明
void *memcpy(void *str1, const void *str2, size_t n);
2.memcpy函数的头文件
#include <string.h>
3.memcpy函数的使用
该函数是将一块内存里的数据复制到另一块内存里去。
int main()
{
int i;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr1[20] = { 0 };
memcpy(arr, arr1, 40);
for (i = 0; i < 10; i++)
{
printf("%d\n", arr1[i]);
}
return 0;
}
输出的结果是1 2 3 4 5 6 7 8 9 10.
4.my_memcpy函数的实现
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest && src);
void* p = dest;
while (count--)
{
*(char*)src = *(char*)dest;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return p;
}
int main()
{
int i;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr1[20] = { 0 };
my_memcpy(arr, arr1, 40);
for (i = 0; i < 10; i++)
{
printf("%d\n", arr1[i]);
}
return 0;
}
六.memmove
1.memmove函数的函数声明
void * memmove(void * destination, const void * source, size_t num);
2.memmove函数的头文件
#include <string.h>
3.memmove函数的使用
该函数是将同一块内存的一些数据复制到这块内存的其他位置上。
int main()
{
int i;
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1+2, arr1, 20);
for (i = 0; i < 10; i++)
{
printf("%d\n", arr1[i]);
}
return 0;
}
打印出来的结果是1 2 1 2 3 4 5 8 9 10。
4.my_memmove函数的实现
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t count)
{
assert(dest && src);
void* p = dest;
if (dest < src)
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return p;
}
int main()
{
int i;
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1+2, arr1, 20);
for (i = 0; i < 10; i++)
{
printf("%d\n", arr1[i]);
}
return 0;
}
以上就是C语言里常用的字符串函数和内存函数的内容。