字符函数和字符串函数

在我们使用C语言进行程序编写时,经常要对字符和字符串进行处理,所以为了在编程中能够更加方便的操作,我们应当学会C语言标准库中提供的一系列库函数,在熟练掌握后能够大大提高编程的效率。常见的函数包括 strlen, strcpy, strcat, strcmp, strncpy, strncat, strncmp, strstr, strtok, strerror。

如何快速理解字符函数

在我看来要彻底熟练的掌握一个函数,最重要的是要理解函数,深入理解函数的操作原理是什么,最好能够以自己的方式写代码模拟实现该函数,以达到一样的效果,这样就能够快速的掌握字符函数并且能熟练运用。

strlen函数

strlen函数是计算在字符串中 ‘ \0 ' 出现之前的字符个数(不包括 ' \0 ' ), 返回类型是一个无符号类型的值,因为字符串中字符的个数不可能为负数。在写代码时可以如下使用:

  1. 在使用 strlen 函数时要包含头文件 string.h
  2. 此代码是用 VS2022 编写,返回类型为 size_t 即为无符号类型,打印也要用 %zd 。
  3. 当字符串中出现 ’\0‘ 时就会结束。

接下来我们就用自己的方式对 strlen 函数进行模拟实现:

实现的办法有三种分别为计数器法、指针-指针、递归,下面我们逐个分析。

计数法

此方法是最为简单且更容易理解的方法,只需要使用循环和非常简单的指针便可以实现。

size_t my_strlen(char* p)
{
	size_t count = 0;
	assert(p);
	while (*p)
	{
		count++;
		p++;
	}
	return count;
}

当指针向后走到 \0 时 while 循环就会停下,此时 count 计数就是字符个数,上述代码中 assert 的作用主要是断言 p 是否是空指针,如果为空指针则条件为假程序就不会运行。

指针运算

指针相减得到的是两指针之间的元素个数,str 指针用于记录字符起始位置,循环使 p 指针找到结尾 \0 的位置。最后返回两指针相减的结果即是想要的结果。

int my_strlen(char* p)
{
	char* str = p;
	while (*p)
	{
		p++;
	}
	return p - str;
}

对于返回类型为 int 、size_t 二者对模拟实现没有太大影响,要准确一点用 size_t 更加合适。

递归

递归是C语言中比较重要的一种编程技巧,它允许函数调用自身来解决问题。


int my_strlen(char* p)
{
	if (*p=='\0')
		return 0;
	else
		return 1 + my_strlen(p + 1);
}

strcpy

后续便不再一一叙述,只要能达到与原函数相同的作用就行。

char* my_strcpy(char* dest, char* sor)
{
	char* str = dest;
	assert(dest && sor);
	while (*dest++ = *sor++)
	{
		;
	}
	return str;
}

strcat

char* my_strcat(char* dest, char* sor)
{
	char* ret = dest;
	assert(dest && sor);
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *sor++)
	{
		;
	}
	return ret;
}

strcmp

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;
}

strncpy

char* my_strncpy(char* dest, const char* sor, size_t num)
{
	char* ret = dest;
	assert(dest && sor);
	while (num)
	{
		*dest = *sor;
		dest++;
		sor++;
		num--;
	}
	return ret;
}

strncat

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

总结

strcpy、strncpy 非常相似只有一个字母的差别,由上也可以看到其他函数,都比没加 n 之前多了一个 num 的变量,我们称这个为长度受限的字符函数,strcpy 称为长度不受限的字符函数。因为多了一个变量的限制,在使用的时候也比不受限的较为安全一点,所以在往后的编程过程中尽量使用受限函数。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值