<string.h>部分函数的使用和模拟实现

1. strlen 函数的使用和模拟实现

通过strlen - C++ Reference (cplusplus.com)可以知道,strlen函数的参数是const类型的字符串,返回值是字符串长度,返回值类型是size_t。 要注意字符串的结束标志是 '\0' strlen函数返回的是 '\0' 之前的数。下面是strlen函数的模拟实现:

1.1函数原型

size_t strlen ( const char * str )

1.2参数

str:常量(const)字符串的地址

1.3返回值

返回一个无符号(size_t)整数

1.4.1实例

#include<stdio.h>
#include<string.h>
main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

1.4.2实例运行结果

1.5.1模拟实现

        1.5.1.计数器

#include<stdio.h>
#include<assert.h>
//计数器
size_t my_strlen1(const char* str)
{
	size_t i = 0;
	while (*str)
	{
		i++;
		str += 1;
	}
	return i;
}

main()
{
	const char* str1 = "abcdef";
	my_strlen1(str1);
	printf("my_strlen1:%zd\n", my_strlen1(str1));
	return 0;
}

1.5.2.1模拟实现运行结果

        1.5.1.递归 

#include<stdio.h>
#include<assert.h>
//递归
size_t my_strlen2(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return my_strlen2(str + 1) + 1;
}

main()
{
	const char* str1 = "abcdef";
	my_strlen2(str1);
	printf("my_strlen2:%zd\n", my_strlen2(str1));
	return 0;
}

1.5.2.2模拟实现运行结果

         1.5.1.3 指针-指针 

#include<stdio.h>
#include<assert.h>
//指针-指针
size_t my_strlen3(const char* str)
{
	assert(str);
	const char*p  = str;
	while (*p)
	{
		p += 1;
	}
	return p - str;
}

main()
{
	const char* str1 = "abcdef";
	my_strlen3(str1);
	printf("my_strlen3:%zd\n", my_strlen3(str1));
	return 0;
}

1.5.2.3模拟实现运行结果

2. strcpy 函数的使用和模拟实现

2.1函数原型

char * strcpy ( char * destination, const char * source )

2.2参数

destination:目标字符串的首元素地址

source:源字符串常量的首元素地址

2.3返回值

返回目标字符串的地址

2.4.1实例

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

main()
{
	char str1[] = "abcdef";
	char str2[20] = { 0 };
	strcpy(str2, str1);
	printf("str2:%s\n", strcpy(str2, str1));
	return 0;
}

2.4.2实例运行结果

 

2.5.1模拟实现

#include<stdio.h>
#include<assert.h>

char* my_strncat(char* dest, const char* src,size_t num)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)
	{
		dest++;
	}
	while (num--)
	{
		*dest++ = *src++;
	}
	return ret;
}

main()
{
	char str1[10] = "abcdef";
	const char str2[10] = "ghijkl";
	my_strncat(str1, str2, 3);
	printf("%s\n", str1);
	return 0;
}

2.5.2模拟实现运行结果

3. strncpy 函数的使用和模拟实现

3.1函数原型

char * strncpy ( char * destination, const char * source, size_t num )

3.2参数

destination:目标字符串的首元素地址

source:源字符串常量的首元素地址

sum:需要拷贝的次数

3.3返回值

返回目标函数的地址

3.4.1实例

#include<stdio.h>
#include<string.h>
 
main()
{
	const char str1[] = "abcdef";
	char str2[20] = { 0 };
	strncpy(str2, str1, 3);
	printf("str2:%s\n", strncpy(str2, str1,3));
	return 0;
}

3.4.2实例运行结果

3.5.1模拟实现

#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* src, size_t sum)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (sum--)
	{
		*dest++ = *src++;
	}
	return ret;
}

main()
{
	const char str1[] = "abcdef";
	char str2[20] = { 0 };
	my_strncpy(str2, str1, 3);
	printf("str2:%s\n", my_strncpy(str2, str1,3));
	return 0;
}

3.5.2模拟实现运行结果

4. strcat 函数的使用和模拟实现

strcat函数的参数是源字符串的地址和目标字符串的地址,类型是char*,返回值是目标字符串的地址,类型是char*。要注意源字符串要以 '\0' 结束,strcat函数会将源数组里的字符接到目标数组的后面,所以目标空间需要足够大且可修改。下面是strcpy函数的模拟实现:

4.1函数原型

char * strcat ( char * destination, const char * source )

4.2参数

destination:目标数组的首元素地址

source:源数组的首元素地址

4.3返回值

返回目标数组的地址

4.4.1实例

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

main()
{
	char str1[10] = "abc";
	const char str2[10] = "def";
	printf("str1:%s\n", str1);
	printf("str2:%s\n", str2);
	strcat(str1, str2);
	printf("str:%s\n", str1);
	return 0;
}

4.4.2实例运行结果

4.5.1模拟实现

#include<stdio.h>
#include<assert.h>

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

main()
{
	char str1[10] = "abc";
	const char str2[10] = "def";
	printf("str1:%s\n", str1);
	printf("str2:%s\n", str2);
	my_strcat(str1, str2);
	printf("str:%s\n", str1);
	return 0;
}

4.5.2模拟实现运行结果

 

5. strncat 函数的使用和模拟实现 

5.1函数原型

char * strncat ( char * destination, const char * source, size_t num )

5.2参数

destination:目标数组的首元素地址

source:源数组的首元素地址

sum:需要运算的次数

5.3返回值

返回目标函数的地址

5.4.1实例

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

main()
{
	char str1[10] = "abc";
	const char str2[10] = "defghi";
	printf("str1:%s\n",str1);
	printf("str2:%s\n", str2);
	strncat(str1, str2, 3);
	printf("%s\n", str1);
	return 0;
}

5.4.2实例运行结果

5.5.1模拟实现

#include<stdio.h>
#include<assert.h>

char* my_strncat(char* dest, const char* src,size_t num)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)
	{
		dest++;
	}
	while (num--)
	{
		*dest++ = *src++;
	}
	return ret;
}

main()
{
	char str1[10] = "abc";
	const char str2[10] = "defghi";
	printf("str1:%s\n", str1);
	printf("str2:%s\n", str2);
	my_strncat(str1, str2, 3);
	printf("%s\n", str1);
	return 0;
}

5.5.2模拟实现运行结果

6. strcmp 函数的使用和模拟实现

6.1函数原型

int strcmp ( const char * str1, const char * str2 )

6.2参数

str1:要比较的第一个字符串

str2:要比较的第二个字符串

6.3返回值

如果str1大于str2返回一个大于零的数

如果str1小于str2返回一个小于零的数

如果str1等于str2返回零

6.4.1实例

#include<stdio.h>
#include<assert.h>

main()
{
	const char* str1 = "abcdef";
	const char* str2 = "abcdd";
	printf("str1:%s\n", str1);
	printf("str2:%s\n", str2);
	int a = strcmp(str1, str2);
	if (a > 0)
		printf("str1>str2\n");
	else if (a < 0)
		printf("str1<str2\n");
	else
		printf("str1=str2\n");
	return 0;
}

6.4.2实例运行结果

6.5.1模拟实现

#include<stdio.h>
#include<assert.h>

int my_strcmp(const char* str1, const char* str2)
{

	assert(str1);
	assert(str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

main()
{
	const char* str1 = "abcdef";
	const char* str2 = "abcdd";
	printf("str1:%s\n", str1);
	printf("str2:%s\n", str2);
	int a = my_strcmp(str1, str2);
	if (a > 0)
		printf("str1>str2\n");
	else if (a < 0)
		printf("str1<str2\n");
	else
		printf("str1=str2\n");
	return 0;
}

6.5.2模拟实现运行结果

7. strncmp 函数的使用和模拟实现

7.1函数原型

int strncmp ( const char * str1, const char * str2, size_t num )

7.2参数

str1:要比较的第一个字符串

str2:要比较的第二个字符串

sum:需要比较的次数

7.3返回值

在sum个字符内如果str1大于str2返回一个大于零的数

在sum个字符内如果str1小于str2返回一个小于零的数

在sum个字符内如果str1等于str2返回零

7.4.1实例

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

main()
{
	const char* str1 = "abceef";
	const char* str2 = "abcdd";
	printf("str1:%s\n", str1);
	printf("str2:%s\n", str2);
	int a = strncmp(str1, str2, 4);
	if (a > 0)
		printf("str1>str2\n");
	else if (a < 0)
		printf("str1<str2\n");
	else
		printf("str1=str2\n");
	return 0;
}

7.4.2实例运行结果

 

7.5.1模拟实现

#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* str1, const char* str2, size_t sum)
{

	assert(str1);
	assert(str2);
	while (*str1 == *str2 && sum--)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

main()
{
	const char* str1 = "abceef";
	const char* str2 = "abcdd";
	printf("str1:%s\n", str1);
	printf("str2:%s\n", str2);
	int a = my_strncmp(str1, str2, 4);
	if (a > 0)
		printf("str1>str2\n");
	else if (a < 0)
		printf("str1<str2\n");
	else
		printf("str1=str2\n");
	return 0;
}

7.5.2模拟实现运行结果

 

8. strstr 函数的使用和模拟实现

8.1函数原型

const char * strstr ( const char * str1, const char * str2 );
      char * strstr (       char * str1, const char * str2 );

8.2参数

str1:指向要搜索的主字符串的指针

str2:指向要搜索的子字符串的指针

8.3返回值

返回一个指向str1中第一次指向str2的指针。如果没有找到就返回空指针(NULL)。

8.4.1实例

#include <stdio.h>
#include <string.h>
#include<assert.h>
int main()
{
	char str[] = "This is a simple string";
	char* pch;
	pch = strstr(str, "simple");
	strncpy(pch, "sample", 6);
	printf("%s\n", str);
	return 0;
}

8.4.2实例运行结果

8.5.1模拟实现

#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 != '\0')
	{
		s1 = p;
		s2 = str2;
		while (*s1++ == *s2++)
		{
			;
		}
		if (*s2 == '\0')
			return (char*)p;
		p++;
	}
	return NULL;
}

main()
{
	char str[] = "This is a simple string";
	char* pch;
	pch = my_strstr(str, "simple");
	strncpy(pch, "sample", 6);
	printf("%s\n", str);
	return 0;
}

8.5.2模拟实现运行结果

 

9. strtok 函数的使用

 9.1函数原型

char * strtok ( char * str, const char * delimiters )

9.2参数

str:要被分解的字符串

delimiters:作为分隔符的字符(也可以是一个集合)。
9.3返回值

返回被分解的第一个字符,如果没有可以检索的字符串就返回空指针(NULL)。

9.4.1实例

#include <stdio.h>
#include <string.h>
int main()
{
 char arr[] = "192.168.6.111";
 char* sep = ".";
 char* str = NULL;
 for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
 {
 printf("%s\n", str);
 }
 return 0;
}

9.4.2实例运行结果

10. strerror 函数的使用

10.1函数原型

char * strerror ( int errnum )

10.2参数

errnum:错误码对应的数字,类型是int。

10.3返回值

函数返回错误码的信息,我们可以将其翻译成对应的错误信息。

10.4.1实例

#include <errno.h>
#include <string.h>
#include <stdio.h>
//我们打印⼀下0~10这些错误码对应的信息
int main()
{
 int i = 0;
 for (i = 0; i <= 10; i++) 
 {
     printf("%s\n", strerror(i));
 }
 return 0;
}

10.4.2实例运行结果

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值