C语言字符串函数和内存函数介绍以及模拟实现

目录

一. 字符串函数

1. strlen  求字符串长度函数

2.strcpy,strcat,strcmp  长度不受限制的字符串函数

3.strncpy,strncat,strncmp  长度受限制的字符串函数 

 4.strstr,strtok  字符串查找

 5.strerror  错误信息报告

二. 内存操作函数

        1.memcpy 

2. memmove

3.memset

4.memcmp


一. 字符串函数

1. strlen  求字符串长度函数

首先,以下是cplus plus官网对strlen函数的解释,传入的是字符类型的指针,返回的是size_t类型的数据,计算的是'\0'之前出现的字符的个数,包含在头文件string.h中。

 以下是其用法:

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "hello world";
	int len = strlen(str);
	printf("%d\n", len);
	return 0;
}

模拟实现(三种方式):

//方法一:计数器
int my_strlen(char* ch)
{
	int count = 0;
	while (*ch)
	{
		count++;
		ch++;
	}
	return count;
}
//方法二:指针减指针
int my_strlen1(char* ch)
{
	char* end = ch;
	while (*end)
	{
		end++;
	}
	return end - ch;
}
//方法三:递归
int my_strlen2(char* ch)
{
	int count = 0;
	if (*ch == '\0')
	{
		return 0;
	}
	else 
	{
		ch++;
		return 1 + my_strlen2(ch);
	}
}

int main()
{
	char ch[] = { 'a','b','v','d','e','\0' };
	int len = my_strlen(ch);
	int len1 = my_strlen1(ch);
	int len2 = my_strlen1(ch);
	printf("%d\n", len);
	printf("%d\n", len1);
	printf("%d\n", len2);
	return 0;
}

2.strcpy,strcat,strcmp  长度不受限制的字符串函数

对于strcpy函数,以下是cplus plus官网对strcpy函数的解释,传入两个类型的数组,将后面的的数组copy到前一个数组,并返回传入数组的首元素地址。

以下是对strcpy的模拟实现:

char* my_strcpy(char* dest, const char* source)
{
	assert(dest && source);
	char* ret = dest;
	while (*dest++ = *source++)
	{
		;
	}
	
	return ret;
}
int main()
{
	char str1[20] = { 0 };
	char str2[] = "hello,bit";
	printf("%s\n", my_strcpy(str1, str2));
	return 0;
}

对于strcat函数,以下是cplus plus官网对strcat函数的解释,这是字符串链接函数,传入两个数组,并返回一个字符类型的指针。

以下是模拟实现: 

//strcat() 模拟实现
char* my_strcat(char* str1, char* str2)
{
	assert(str1 && str2); 
	char* ret = str1;
	while (*str1 != '\0')
	{
		str1++;
	}
	while (*str1++ = *str2++)
	{
		;
	}
	return ret;
}

int main()
{
	char str1[20] = "hello ";
	char str2[] = "bit";
	printf("%s\n", my_strcat(str1, str2));
	return 0;
}

对于strcmp函数,以下是cplus plus官网对strcmp函数的解释,这是字符串比较函数,比较的是字符的ASCII码值,如果str1指向的字符大于str2指向的字符,则返回一个大于0的数字,小于则返回小于0的数字,相等则返回0。

以下是对它的模拟实现: 

//strcpy() 模拟实现
int my_strcmp(const char* str, const char* str1)
{
	assert(str && str1);
	while (*str == *str1)
	{
		if (!*str)
		{
			return 0;
		}
		str++;
		str1++;
	}
	return *str - *str1;
}
int main()
{
	char str[] = { "hello, world" };
	char str1[] = { "hello, world!" };
	if (my_strcmp(str, str1) > 0)
	{
		printf(">\n");
	}
	else 
	{
		printf("<=\n");
	}
	return 0;
}

3.strncpy,strncat,strncmp  长度受限制的字符串函数 

对于strncpy函数,以下是cplus plus官网对strncpy函数的解释,相较于strcpy只是多了一个size_t的传入类型。

模拟实现: 

#include <stdio.h>

char* my_strncpy(char* dest, const char* src, size_t n) {
    char* result = dest;
    size_t i;

    for (i = 0; i < n && src[i] != '\0'; i++) {
        dest[i] = src[i];
    }

    for (; i < n; i++) {
        dest[i] = '\0';
    }

    return result;
}

int main() {
    char src[] = "Hello, world!";
    char dest[15];

    my_strncpy(dest, src, sizeof(dest));

    printf("Copied string: %s\n", dest);

    return 0;
}

对于strncat函数,以下是cplus plus官网对strncat函数的解释,用于将一个字符串的一部分或全部内容追加到另一个字符串的末尾。

模拟实现: 

char* strncat(char* dest, const char* src, size_t n) {
    char* result = dest;

    // 找到目标字符串的末尾
    while (*dest != '\0') {
        dest++;
    }

    // 追加源字符串的内容到目标字符串的末尾,最多追加n个字符
    while (*src != '\0' && n > 0) {
        *dest = *src;
        dest++;
        src++;
        n--;
    }

    // 加上字符串结束符
    *dest = '\0';

    return result;
}

int main() {
    char dest[20] = "Hello, ";
    char src[] = "world!";

    strncat(dest, src, sizeof(dest) - strlen(dest) - 1);

    printf("Concatenated string: %s\n", dest);

    return 0;
}

对于strncmp函数,以下是cplus plus官网对strncmp函数的解释,用于比较两个字符串的前n个字符是否相等。

int strncmp(const char* str1, const char* str2, size_t n) {
    while (n > 0) {
        if (*str1 != *str2) {
            return (*str1 - *str2);
        }

        if (*str1 == '\0') {
            return 0;  // 达到字符串末尾,相等
        }

        str1++;
        str2++;
        n--;
    }

    return 0;  // 比较完n个字符,相等
}

int main() {
    char str1[] = "Hello";
    char str2[] = "Hell";
    int result = strncmp(str1, str2, 4);

    if (result == 0) {
        printf("Strings are equal.\n");
    }
    else if (result < 0) {
        printf("String 1 is less than string 2.\n");
    }
    else {
        printf("String 1 is greater than string 2.\n");
    }

    return 0;
}

 4.strstr,strtok  字符串查找

strstr函数,以下是在cplusplus官网对其的解释,用于在一个字符串中查找另一个字符串的第一次出现位置。

#include <assert.h>
char* my_strstr(const char* str1,const char* str2)
{
	assert(str1 && str2);
	char* cp = str1;
	char* s1 = NULL;
	char* s2 = NULL;
	if (*str2 == '\0')
	{
		return str1;
	}
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 != '\0' && *s2 != '\0' && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cp;
		}
		cp++;
	}
	return NULL;
}
int main()
{
	char* str1 = "abcdddefg";
	char* str2 = "ddd";
	printf("%s",my_strstr(str1, str2));
	return 0;
}

 strtok函数,以下是在cplusplus官网对其的解释,用于将一个字符串按照指定的分隔符进行分割。

以下是其的基本用法: 

int main() {
    char str[] = "Hello, world! How are you?";
    char delim[] = " ,!?";  // 分隔符可以是空格、逗号、问号和感叹号
    char* token;

    // 使用strtok分割字符串
    token = strtok(str, delim);
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, delim);
    }

    return 0;
}

 5.strerror  错误信息报告

strerror函数,以下是在cplusplus官网对其的解释,用于将错误码转换为对应的错误信息字符串。

以下是其基本用法 

#include <errno.h>

int main() {
    int errnum = 2;  // 假设发生了一个错误,错误码为2
    const char* errmsg = strerror(errnum);

    printf("Error message: %s\n", errmsg);

    return 0;
}

 

二. 内存操作函数

        1.memcpy 

memcpy函数是C语言标准库中的一个内存拷贝函数,用于将一段内存的内容复制到另一段内存。以下是cplusplus对其的解释。

 

基本用法: 

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, world!";
    char dest[20];

    memcpy(dest, src, strlen(src) + 1);

    printf("Copied string: %s\n", dest);

    return 0;
}

模拟实现: 

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[20] = { 0 };
	int arr2[] = { 1,2,3,4,5,6 };
	my_memcpy(arr1, arr2, 24);
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}


2. memmove

memmove函数是C语言标准库中的一个内存拷贝函数,用于在内存中移动一段数据。与memcpy函数不同的是,memmove函数可以正确处理源和目标内存区域的重叠。以下是cplusplus对其的解释。

基本用法: 

int main() {
    char str[] = "Hello, world!";
    memmove(str + 7, str, strlen(str) + 1);

    printf("Moved string: %s\n", str);

    return 0;
}

 模拟实现:

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 arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
	my_memmove(arr1, arr1 + 2, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
	return 0;
}

以下是对模拟实现的图解: 

 

3.memset

memset函数是C语言标准库中的一个内存设置函数,用于将一段内存区域的内容设置为指定的值。以下是cplusplus对其的解释。

基本用法: 

int main() {
    char str[20];

    // 使用memset将str中的内容设置为字符'A'
    memset(str, 'A', sizeof(str));

    printf("Filled string: %s\n", str);

    return 0;
}

4.memcmp

memcmp函数是C语言标准库中的一个内存比较函数,用于比较两段内存区域的内容是否相等。以下是cplusplus对其的解释。

基本用法: 

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Hello";
    char str2[] = "World";

    int result = memcmp(str1, str2, sizeof(str1));

    if (result == 0) {
        printf("The strings are equal.\n");
    } else if (result < 0) {
        printf("str1 is less than str2.\n");
    } else {
        printf("str1 is greater than str2.\n");
    }

    return 0;
}

 以上就是我对字符串函数和内存函数的理解。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值