c语言字符操作函数汇总及模拟实现

"本文详细介绍了C语言中的字符串函数,包括strcpy, strcmp, strcat, strncpy和strncat的定义、原理及源码实现。文章通过实例演示了这些函数的使用,并强调了在使用过程中需要注意的数组边界和字符串结束标志''的问题。此外,还探讨了字符串比较函数strcmp和strncmp的工作机制。"
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

好一段时间没发布文章了,今天为大家分享一些c语言字符串函数。包括strcpy,strcmp,strcat,strncpy,strncmp,strncat等,内容仅供参考要是有不足之处望指出。


目录

一、strcpy,strncpy

1.strcpy函数定义

2.strcpy原理

3.strncpy

4.strncpy函数声明

5.函数源码

二、strcat,strncat

1.strcat函数声明

2.原理&源码

三. strcmp,strncmp

1.strcmp函数声明

2.strcmp源码

3.strncmp函数


一、strcpy,strncpy

1.strcpy函数定义

     这里参考的是msdn中strcpy的一些基本信息。 

这里我们可以知道strcpy是字符拷贝函数,简介是拷贝字符串。函数接收的基本参数是char*strdestination这个是一个目的地字符指针,简单来说就是要把字符串拷贝到那个位置;const char*strsource是拷贝的初始位置。返回值是char*类型返回的内容就是目的地字符串的首地址

2.strcpy原理

        先上代码(按照库函数实现)//参考vs2022

char* my_strcpy(char* arr, const char* arr1)//因为源字符串在此函数不能改变所以加上const
{
	char* ret = arr;//保存要返回的指针位置;
	assert(arr && arr1);//断言arr和arr1是否为空指针,若是空指针报错
	while (*arr++ = *arr1++)//将源头的字符串赋值到目的地,以'\0'结束;
		;
	return ret;
}
int main()
{
	char arr[10] = "abcde";
	char arr1[] = "bit";
	my_strcpy(arr, arr1);
	printf("%s", arr);
	return 0;
}

这是模拟库函数实现的strcpy函数,大家可以参考上边都有注释。运行结果为:未运行前

 运行后:

 这说明strcpy是从指针位置开始一直拷贝到'\0'(包括'\0')。这是无长度限制的结束只以'\0'结束,所以在使用时要考虑字符串是否存在'\0'不然数组可能越界操作。

3.strncpy

        前面的strcpy是无限制长度的字符拷贝函数,因为在一些特殊条件下会出现错误,或想拷贝的字符串只有一部分那么c语言给出了strncpy这个函数用来拷贝固定个数字符,下面为大家简单的介绍一些strncpy函数。

4.strncpy函数声明

        这个函数和strcpy很相似不同的有这个函数是拷贝固定个数的字符,他的函数参数里面最后多了一个size_t这个是无符号整型,因为拷贝个数一定是正的所以用的无符号整型,这个是在c语言中typedef了的大家可以搜一下看看,这里就不多介绍。 

5.函数源码

        这里也是模仿库中的代码,和strcpy大同小异大家参考:

char* my_strncpy(char* arr, const char* arr1,size_t n)
{
	char* ret = arr;//保存返回的指针。
	assert(arr && arr1);//断言两个指针不能为空。
	while (n && (*arr++ = *arr1++))//开始循环赋值
		n--;
	if (--n)//当遇到'\0'时n会少减一次,真实的n为n-1;
		while (n--)
			*arr++ = '\0';
	return ret;
}
int main()
{
	char arr[10] = "abcde";
	char arr1[] = "bit";
	my_strncpy(arr, arr1,4);
	printf("%s", arr);
	return 0;
}

运行结果:运行前内存布局

运行后:

 

        这里特别说明如果拷贝的n比arr1整体内容大的话比如上边的代码是4为正常长度如果是6那么该如何拷贝呢-------这里c语言规定超出的部分一律补'\0'。参考下方运行结果。

 

 结果为:

 这就是关于字符串拷贝的一些知识,如有纰漏望指错,还有大家在使用时目的字符串的空间一定要留够哦。

二、strcat,strncat

1.strcat函数声明

            

 如图,strcat的作用是追加一个字符串,返回类型是char*,第一个参数和第二个参数和上边的strcpy一样第一个是追加的目的地,第二个是追加的源头。下面为大家简单介绍一下这个函数的原理。注意strcat不能追加自己不能strcat(string1,string1);这样写是错误的!!!!!

2.原理&源码

先上代码


char * strcat(char * dest, const char * src)
{
        char *tmp = dest;//函数返回指针
 
        while (*dest)//循环查找目的地的'\0'
                dest++;
        while ((*dest++ = *src++) != '\0')//循环赋值
                ;
 
        return tmp;

}

如图,strcat与上面的strcpy很相似只不过strcat是从'\0'开始追加字符串。而strncat和strncpy也差不多这里不做过多介绍。

三. strcmp,strncmp

1.strcmp函数声明

 下面为大家介绍一下字符串比较函数strcmp函数    c语言标准规定

第一个字符串大于第二个字符串,则返回大于0的数字 。第一个字符串等于第二个字符串,则返回0 。第一个字符串小于第二个字符串,则返回小于0的数字。

那么这就引出一个问题,字符串是怎么比较的,下面给大家举一个例子比如"abcde"和"atre",比较这两个字符串是这样比的就是一个字母一个字母的比,比较的是字母的ascall码表;比如首先字符a和a比较二者的ascall码值相等,然后比较第二个b和t比明显t的ascall值大于a的;所以第二个字符串大于第一个;这样的话我们就可以实现我们的代码了。

2.strcmp源码

此源码参照vs2022进行一些小的改动:

int my_strcmp(const char* p1, const char* p2)//进行比较不改变用count修饰
{
	assert(p1 && p2);//断言p1 p2不能是空指针
	while (*p1++ == *p2++)//循环判断每个字符;
	{
		if (*p1 == '\0'&&*p2=='\0')//如果二者相同到'\0'证明字符串相等
			return 0;
	}
	if (*p1 != *p2)
	{
		return *--p1 - *--p2;
	}
}

 这就是函数的原型供大家参考。

3.strncmp函数

这是strncmp的一些基本信息两个字符串一个无符号整型。比较方式和strcmp相同源码如下

int __cdecl strncmp (const char * first,const char * last, size_t count)

{

   if (!count)

       return(0);
   while (--count && *first && *first == *last)

    {

        first++;

        last++;

    }

   return( *(unsignedchar *)first - *(unsignedchar *)last );
}

 这就是本期整理的一些关于字符串操作函数的所有内容,觉得有用的朋友点个赞。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白_moon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值