ANSI C库用于处理字符串的函数strcpy/strcmp/strcat/,,模拟实现三个库函数

本文介绍了C语言中几个关键的字符串处理函数,如strcpy用于完全复制字符串,strncpy限制拷贝的字符数,strcat和strncat实现字符串拼接,strcmp和strncmp进行字符串比较,strchr、strpbrk查找字符,strrchr和strstr搜索子字符串。这些函数在处理字符数据时非常实用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意下列函数

1.返回值都是一个地址(char*类型)文章中提到返回s1即返回s1的地址。

2.接受两个字符作为参数(或者有第三个整形参数)

·  char*strcpy(char*restrict s1,const char *restrict s2);

该函数把s2指向的字符串(包括空字符)拷贝至s1指向的位置,返回值是s1。

·char *strncpy(char*restrict s1,const char*restrict s2,size_n);

      该函数把s2指向的字符串拷贝至s1指向的位置,拷贝的字符数不超过n,其返回值是s1。该函数不会拷贝空字符后面的字符,如果源字符串的字符少于n个,目标字符串就以拷贝的空字符结尾: 如果源字符串有n个或超过n个字符,就不拷贝空字符。

·char *strcat (char restrict s1,const char*restrict s2):

      拼接字符串,将第二个字符串的备份拼接在第一个字符串末尾。s2字符串的第1个字符将覆盖s1字符串末尾的空字符。该函数返回第一个参数s1

char *strncat(char *restrict s1,const char *restrict s2,size_t n);

       该函数把s2字符串拷贝至s1字符串末尾,直到遇到\0或者第n个字符。第三个参数指定了最大添加字符数,用于防止strcat()函数拼接后s1缓冲区溢出导致的问题,该函数返回s1。

·int strcmp (const char*s1,const char *s2):

       该函数通过比较运算符来比较字符串,如果s1字符串在机器排序序列中位于s2字符串的后面,该函数返回一个正数;如果两个字符串相等,则返回0;如果s1字符串在机器排序序列中位于s2字符串的前面,则返回一个负数。该函数比较字符串而不是数组,如果申请的数组空间大于字符串需要空间,比较完字符串就返回值,不会遍历数组,且结尾空字符也参与字符串的比较。

//注意该函数比较字符串“A”而不是字符’A‘。

·int strncmp (const char *s1,const char *s2,size_t n);

       该函数的作用和strcmp ()类似,不同的是,该函数在比较n个字符后或遇到第1个空字符时停止比较。

·char *strchr(const char*s,int C);

        如果s字符串中包含c字符(第二个参数字符),该函数返回指向s字符串首次出现的c字符的指针(末尾的空字符也是字符串的一部分,所以在查找范围内);如果在字符串s中未找到c字符,该函数则返回空指针。

char *strpbrk(const char *s1,const char*s2);

        如果s1字符中包含s2字符串中的任意字符,该函数返回指向s1字符串首位置的指针:如果在s1字符串中未找到任何s2字符串中的字符,则返回空字符。

·char*strrchr (const char*s1,char c);

      该函数返回s字符串中c字符的最后一次出现的位置(未尾的空字符也是字符串的一部分,所以在查找范围内)。如果未找到c字符,则返回空指针。

·char *strstr (const char *s1,const char*s2):

     该函数返回指向s1字符串中s2字符串出现的首位置。如果在sl中没有找到s2,则返回空指针。

对库函数的模拟实现;

#define _CRT_SECURE_NO_WARINGS 1

//模拟实现strncpy和strncat/strncmp
#include<assert.h>
#include<stdio.h>

char* my_strncat(char* dest, const char* sour,int n)
{
	assert(dest && sour);
	char* ret=dest;
	int count = 0;
	while (*dest != '\0')
	{
		dest++;
	}
	while (count++ < n && (*dest++ = *sour++))
	{
	;
	}
	return ret;
}

char* my_strncpy(char* dest, const char* sour, int n)
{
	assert(dest && sour);
	char* ret=dest;
	while (n--)
	{
		*dest++ = *sour++;
	}
	return ret;
}


int my_strncmp(char* dest, const char* sour, int n)
{
	assert(dest && sour);
	while (*dest == *sour)
	{
		dest++;
		sour++;

	}
	return (*dest - *sour);
}

int main()
{
	char arr1[] = "hello lf";
	char arr2[] = "hello wolf";
//	my_strncat(arr1, arr2,3);
//	my_strncpy(arr1, arr2, 3);
	my_strncmp(arr1, arr2, 3);

	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

客行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值