自己编程实现strcat,strcpy,strlen ,strstr,strcmy

本文详细介绍了C语言中常用的字符串操作函数,包括字符串连接(strcat)、拷贝(strcpy)、长度计算(strlen)、查找(strstr)及比较(strcmp)等功能的具体实现方式。

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

字符串结束符 '\0' 的 ASCII 值 正好是 0。 所以 用 0 判断 和 用 '\0' 判断,结果一样。

1) strcat 字符串连接函数

2)strcpy 字符串拷贝函数

3)strlen 字符串长度函数

4)strstr查找字符串函数

1) strcat 字符串连接函数

char *my_strcat(char *dst,const char *src){

if((dst==NULL) || (src==NULL))

return NULL;

char *p=dst;//下面的操作会改变目的指针的指向,所以先定义一个指针来记录目的指针dest最开始的指向

while(*dst != '\0')   dst++;

while(*src != '\0')   *dst++=*src++;

*dst='\0';

return p;//dst现在指向的是最后一位字符,在这里返回dst,会出现错误

}

2) strcpy 字符串拷贝函数

char *my_strcpy(char *dst,const char *src){

if((src==NULL) || (dst == NULL)) //判断源指针和目的指针是否为空指针

return NULL;

char *p=dst;

while( (*dst++==*src++)!= '\0') ;

return p;//目的指针dst已经移动,所以定义一个指针p记录首指针

}

3) strlen 字符串长度函数

int my_strlen(char *src){

assert(src!=NULL);

int len;

while((*src++) != '\0')

len++;

return len;

}

4) strstr查找字符串函数

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strstr(const char *dst, const char *src) {
assert(dst != NULL);
while ((*dst != *src) && (*dst !='\0')) {
dst++;
}
while (*dst == *src) {
const char *pdst = dst;
const char *psrc = src;
while (*pdst == *psrc) {
pdst++;
psrc++;
}
if (*psrc == '\0')
return (char *)dst;
else
dst++;
}
return NULL;
}
int main() {
char a[] = "asdfghjkl";
char b[] = "gh";
char *p = my_strstr(a, b);
printf("%s\n", p);
system("pause");
return 0;
}

5)strcmp 字符串比较函数

if str1>str2  返回1

if str1=str2  返回0

if str1<str2  返回-1

对字符的ASCII码进行比较,一种是利用减法运算判断结果,另一种是利用比较运算得出结果。

int my_strcmp(const char *str1, const char *str2) {

if ((str1 == NULL) || (str2 == NULL)) { //判断是否为空指针
return 2;
}
while ((*str1 == *str2) && (*str1 != '\0')) {  //如果*str1 == *str2,则*str1 != '\0'和*str2 != '\0'的作用一样
str1++;  
str2++;
}
if (*(unsigned char*)str1 > *(unsigned char*)str2) { /*使用*(unsigned char*)str1而不是用*str1。这是因为传入的参数为有符号数,有符号字符值的范围是-128~127,无符号字符值的范围是0~255,而字符串的ASCII没有负值,若不转化为无符号数这回在减法实现时出现错误。*/
return 1;
}
else if (*(unsigned char*)str1 < *(unsigned char*)str2) {
return -1;
}
else
return 0;
}
void main() {
char a[] = "asdf";
char *b = "asdf";
int c;
c = my_strcmp(a, b);
printf("%d\n", c);
system("pause");
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值