C语言进阶——3字符函数和内存函数介绍(1)

  1. 求字符串长度
    strlen
  2. 长度不受限制的字符串函数
    strcpy
    strcat
    strcmp
  3. 长度受限制的字符串函数介绍
    strncpy
    strncat
    strncmp

1 stelen

size_t strlen ( const char * str );
  • 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包 含 ‘\0’ )。
  • 参数指向的字符串必须要以 ‘\0’ 结束。
  • 注意函数的返回值为size_t,是无符号的

1.1 库函数strlen模拟实现

1.递归实现

//递归
int my_strlen1(const char* str)
{
	assert(str != NULL);
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}


指针-指针方式实现

int my_strlen2(const char* str)
{
	const char* start = str;
	assert(str != NULL);
	while (*str)
	{
		str++;
	}
	return str - start;
}

普通实现

#include <stdio.h>
int my_strlen(const char* str)
{
	assert(str != NULL);
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

//strlen 是求字符串长度的,求出的长度是不可能为负数的
//所以返回类型设置为size_t 也是合情合理的
typedef unsigned int size_t;

size_t strlen(const char* string);

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);

	return 0;
}

2 strcpy

char* strcpy(char * destination,const char *source)
  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。

2.1 库函数strcpy模拟实现

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* sour)
{
	assert(dest && sour);
	char* ret = dest;
	while (*dest++ = *sour++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr[20] = " ";
	char test[] = "cbdfghj";
	 my_strcpy(arr,test);
	printf("%s\n", arr);

	return 0;
}

在这里插入图片描述

3 strcat

char * strcat ( char * destination, const char * source )
  • 源字符串必须以 ‘\0’ 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。
  • strcat不能给自己追加。\0会被覆盖,导致字符串找不到\0,使代码死循环

3.1 strcat库函数模拟实现


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

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	//首先找到目标空间的'\0'
	while (*dest)
	{
		dest++;
	}
	//然后追加,就是strcpy思路一样,会把‘\0’拷贝过去
		//注意这里追加就会把目标字符串的结尾‘\0’直接覆盖,
	// 所以不能自己给自己追加,这样就没有'\0'了
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr[20] = "dfef ";
	char test[] = "cbdfghj";
	int ret = my_strcat(arr,test);

	printf("%s\n", arr);

	return 0;
}

在这里插入图片描述

4 strcmp

int strcmp ( const char * str1, const char * str2 );
  • 标准规定:
    第一个字符串大于第二个字符串,则返回大于0的数字
    第一个字符串等于第二个字符串,则返回0
    第一个字符串小于第二个字符串,则返回小于0的数字
    vs2022中是大于返回1 ,小于返回-1,相等返回0

4.1 strcmp库函数模拟实现

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


int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	/*if (*str1 > *str2)
		return 1;
	else
		return -1;*/
	return *str1 - *str2;
}


int main()
{
	char arr[20] = "dfef ";
	char test[] = "cbdfghj";
	int ret = my_strcmp(arr,test);


	printf("%d\n", ret);


	return 0;
}

在这里插入图片描述
上面的:strcpy/strcat/strcmp都是长度不受限制的字符串函数,操作不当就容易越界,使得栈崩溃
C语言就又有了以下的长度受限制的字符串函数:strncpy/strncat/strncmp
在上面不受限的函数中添加了一个参数,指明要操作的长度

5 strncpy

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

在这里插入图片描述

  • 拷贝num个字符从源字符串到目标空间。
    如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个

5.1 模拟实现strncpy

#include<assert.h>
char* my_strncpy(char* destination, const char* source, size_t num)
{
    assert(destination && source);
    char* statr = destination;//记录起始位置
    while (num && (*destination++ = *source++))//搬运数据
    {
        num--;
    }
    if (num)//当num大于source长度时候,补充"\0"
    {
        while (--num)
        {
            *destination++ = '\0';
        }
    }
    return statr;
}


int main()
{
    char arr1[] = "abcdefghi";
    char arr2[] = "bit";
    my_strncpy(arr1, arr2, 6);
    printf("%s\n", arr1);
    return 0;
}

在这里插入图片描述

6 strncat

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

在这里插入图片描述

  • 将源的前 number 个字符复制到目标。如果在复制 num 个字符之前找到源 C 字符串的末尾(由 null 字符表示),则目标将填充零,直到写入总数 num 个字符为止。
  • 如果 source 长于 num,则不会在 destination 的末尾隐式附加 null 字符。因此,在这种情况下, destination 不应被视为以 null 结尾的 C 字符串(因此读取它会溢出)。
  • destination 和 source 不应重叠

6.1 模拟实现strncat

#include<assert.h>
char* my_strncat(char* destination, const char* source, size_t num)
{
    assert(destination && source);
    char* start = destination;
    while (*destination != '\0') {
        destination++;
    }

    // 将源字符串的前n个字符追加到目标字符串后面
    while (num && (*destination++ = *source++) != '\0') {
        num--;
    }

    // 在新字符串的末尾添加空字符
    *destination = '\0';


    return start;
}


int main()
{
    char arr1[20] = "I LOVE YOU ";
    my_strncat(arr1, "SORRY", 3);
    // 经过函数My_strncat后,arr1里应该是字符串"I LOVE YOU SOR"
    printf("arr1: %s\n", arr1);
    return 0;
}

在这里插入图片描述

7 strncmp

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

在这里插入图片描述

  • 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
    在这里插入图片描述
内容概要:本文是一份针对2025年中国企业品牌传播环境撰写的《全网媒体发稿白皮书》,聚焦企业媒体发稿的策略制定、渠道选择与效果评估难题。通过分析当前企业面临的资源分散、内容同质、效果难量化等核心痛点,系统性地介绍了新闻媒体、央媒、地方官媒自媒体四大渠道的特点与适用场景,并深度融合“传声港”AI驱动的新媒体平台能力,提出“策略+工具+落地”的一体化解决方案。白皮书详细阐述了传声港在资源整合、AI智能匹配、舆情监测、合规审核及全链路效果追踪方面的技术优势,构建了涵盖曝光、互动、转化与品牌影响力的多维评估体系,并通过快消、科技、零售等行业的实战案例验证其有效性。最后,提出了按企业发展阶段营销节点定制的媒体组合策略,强调本土化传播与政府关系协同的重要性,助力企业实现品牌声量与实际转化的双重增长。; 适合人群:企业市场部负责人、品牌方管理者、公关传播从业者及从事数字营销的相关人员,尤其适用于初创期至成熟期不同发展阶段的企业决策者。; 使用场景及目标:①帮助企业科学制定媒体发稿策略,优化预算分配;②解决渠道对接繁琐、投放不精准、效果不可衡量等问题;③指导企业在重大营销节点(如春节、双11)开展高效传播;④提升品牌权威性、区域渗透力与危机应对能力; 阅读建议:建议结合自身企业所处阶段发展目标,参考文中提供的“传声港服务组合”与“预算分配建议”进行策略匹配,同时重视AI工具在投放、监测与优化中的实际应用,定期复盘数据以实现持续迭代。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值