strcpy、strlen、strcmp的不使用库函数实现

本文详细介绍了C语言中常用的字符串操作函数strcpy、strlen和strcmp的使用方法、原理及注意事项,通过实例演示帮助读者更好地理解和掌握这些核心知识点。
#include <assert.h>
char *strcpy(char *dst, const char *src)//使用const来约束src,表明src对应的内容不能被修改。
{
	assert((dst != NULL) && (src != NULL));//使用断言assert来检验输入参数的有效性
	char *tmp = dst;
	while ((*dst++ = *src++) != '\0')
	 /* nothing */;
	return tmp;//返回dst,以便实现链式表达式    
}


int strlen(const char * str) 
{
     assert( str != NULL );
     const char *cp =  str;
     while (*cp++ )
          ;
     return (cp - str - 1 );
 } 


int strcmp(const char *src, const char *dst)
{
	 assert((dst != NULL) && (src != NULL));
	 int ret = 0 ; 
	 while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) 
	 { ++src; ++dst; } 
	 if ( ret < 0 ) 
		 ret = -1 ; 
	 else if ( ret > 0 ) 
		 ret = 1 ; 
	 return ret;
}


 

### C语言 `strcpy`、`strlen` 和 `strcmp` 函数的使用说明及区别 #### 一、`strlen` 函数 `strlen` 是用于计算字符串实际长度的标准库函数,它会统计直到遇到第一个 `\0` 字符之前的字符数量。该函数会将终止符 `\0` 计入总长度。 以下是常见的实现方式之一: ```c size_t my_strlen(const char *s) { const char *p = s; while (*p != '\0') p++; return (p - s); } ``` 此代码通过遍历字符串中的每一个字符来找到结束标志位并返回有效字符的数量[^1]。 #### 二、`strcpy` 函数 `strcpy` 的功能是从源地址拷贝数据至目标地址,直至遇到原串的第一个`\0`为止。需要注意的是,在调用这个函数之前要确保目的缓冲区有足够的空间容纳被复制的内容以及结尾处的零字节(`'\0'`)。 这里给出一种简单的自定义版本: ```c char* my_strcpy(char *dest, const char *src){ char *ret = dest; while ((*dest++ = *src++) != '\0'); return ret; } ``` 上述例子展示了如何逐个字符地把 src 中的数据移动到 dest 当中去,并保持原有的顺序变[^2]。 #### 三、`strcmp` 函数 `strcmp` 被用来比较两个以 NULL 结束之字符串 s1 及 s2 。如果两者完全相同,则返回值等于 0;若前者小于后者则返回负数(-ve),反之亦然(+ve)。 下面是一个基本的例子展示它的行为模式: ```c int my_strcmp(const char *s1, const char *s2){ for(; *s1 == *s2; ++s1, ++s2) if(*s1 == '\0') return 0; return *(unsigned char *)s1 - *(unsigned char *)s2 ; } ``` 在这个版本里,我们逐一检查每一对对应的字母是否相匹配,一旦发现差异就立即停止循环并依据 ASCII 值差额决定最终的结果正负号[^4]。 #### 四、主要区别总结表 | 特性 | strlen | strcpy | strcmp | |--------------|----------------------------|----------------------------------|------------------------------| | **作用** | 获取字符串长度 | 复制字符串 | 对比两字符串 | | **参数列表** | 单输入:待测字符串 | 双向传递:目的地&源头 | 输入双参:需对比的第一第二串 | | **返回结果** | 非负整数值 | 指针指向已修改后的首位置 | 整型表示相对关系 | 以上就是关于这三个常用标准库函数的基础解析及其相互间的异同点概述[^3]^。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值