一些字符函数的实现。

#define _CRT_SECURE_NO_WARNINGS 1
//求字符串长度。
#define _CRT_SECURE_NO_WARNINGS 1
#include
  
  
   
   
#include
   
   
    
    
//size_t my_strlen( const char *str)
//{
//   assert(str != NULL);
//	int count = 0;
//	while (*str++)
//	{
//		count++;
//	}
//	return count;
//}
size_t my_strlen(const char *str)
{
	assert(str != NULL);
	if (*str++)
	 return my_strlen(str)+1;//当*str不为\0时,调用该函数,并统计一个字符。
	else
		return 0;//当*str为零时,递归结束。
}
int main()
{
	const char *str = "1234567890";
	printf("%d\n", my_strlen(str)); 
	system("Pause");
	return 0;

}
字符串的比较。
#include
    
    
     
     
int my_strcmp(const char *dest, const char *src)
{
	while ((*src != '\0') && (*dest == *src))
	{
		dest++;
		src++;
	}
	return ((*dest - *src)>0 ? 1 : ((*dest - *src)<0 ? -1 : 0));
}
int main()
{
	const char *p1 = "dbcd";
	const char *p2 = "dbc";
	printf("%d\n", my_strcmp(p1, p2));
	system("pause");
	return 0;
}
判断一个字符串是不是另一个字符串的子字符串。
#define _CRT_SECURE_NO_WARNINGS 1
#include
     
     
      
      
char *my_strstr(const char *dest, const char *src)
{
	char *src_temp ;//源字符串的指针临时变量。
	char *dest_temp ;//目标字符串的指针临时变量。
	while (*dest )//判断是否到目标字符串的最后一位。
	{
        dest_temp = dest;//每次内循环结束重新赋值,为目标字符串的指针临时变量重新赋址。
		 src_temp = src;//每次内循环结束重新赋值,使源字符串的指针临时变量重新指向第一个字符。
		while ((*dest_temp )&&(*src_temp == *dest_temp++))//逐个判断源字符串字符是否等于目标字符串字符。
		{
			src_temp++;
		}
		if (*src_temp == '\0')//判断源字符串字符的指针临时变量是否达到最后一个字符。
			return dest;//如果是就返回目标字符串第一次正确匹配时的第一个字符的地址。
		dest++;//如果不是让目标字符串指针临时变量向后移动一个字节。
	}
	return NULL;//如果没有找到返回空指针。
}
int main()
{
	const char *p1 = "cdcecdecd";
	const char *p2 = "cdcecdecde";
	printf("%p\n", my_strstr(p1, p2));
	system("pause");
	return 0;
}
字符串的追加
#include
      
      
        #include 
       
         char *my_strcat(char *dest,const char *src) { assert(dest != NULL);//判断目标字符串指针临时变量是否为空。 assert(src != NULL);//判断源字符串指针临时变量是否为空。 char *ret = dest;//创建一个返回的指针变量,保存目标字符串的起始地址。 while (*dest != '\0')//使目标字符串指针临时变量指向'\0'。 { dest++; } while (*dest++ = *src++)//把源字符串内容追加给目标字符串。 { ; } return ret;//返回目标字符串的起始地址。 } int main() { char arr[50] = "strcat use"; char *p = "dest src"; printf("%s", my_strcat(arr, p)); system("pause"); return 0; } //字符串的逆置 #include 
        
          char *Inver(char *dest) { char *ret = dest;//创建一个返回的指针变量,保存目标字符串的起始地址。 char *tm_val = dest;//源字符串的指针临时变量。 while (*dest)//使源字符串的指针临时变量指向'\0'。 { dest++; } while (tm_val<(--dest))//交换内容 { *tm_val = *tm_val^*dest; *dest = *dest^*tm_val; *tm_val = *tm_val^*dest; tm_val++; } return ret ;//返回目标字符串的起始地址。 } int main() { char arr[30] = "abcdefg"; printf("%s", Inver(arr)); system("pause"); return 0; } //memcpy()函数的实现。 #include 
         
           #include 
          
            void *MY_memcpy(void *dest, const void *src,size_t n) { char *dest_temp = (char*)dest;//用一个字符型指针接受一个强制类型转换后的目标的起始地址。 char *src_temp = (char*)src;//用一个字符型指针接受一个强制类型转换后的源的起始地址。 while (n--)//控制拷贝次数 { *dest_temp++ = *src_temp++;//把源的内容一个字节一个字节的拷贝给目标,然后两个指针变量同时向后移动一个字节 } return dest;//返回目标的起始地址 } int main() { int arr[30] = { 0 }; int arr1[5] = { 1, 2, 3, 4, 5 }; int i = 0; MY_memcpy(arr, arr1, sizeof(arr1)); /*MY_memcpy(arr+1, arr, sizeof(arr1));*///地址重叠时就会出现拷贝错误,与下面memmove()函数分别运行,对照结果 /*memmove(arr + 1, arr, sizeof(arr1));*///验证地址重叠时拷贝后的结果 while (i<10) printf("%d ",arr[i++] ); system("pause"); return 0; } //memmove()函数的实现。 #define _CRT_SECURE_NO_WARNINGS 1 #include 
           
             #include 
            
              void *MY_memmove(void *dest, const void *src, size_t n) { if ((src < dest) && (((char*)src + n - 1) >= (char*)dest) )//当拷贝内容出现这种重叠时,采用倒序赋值。 { while (n--) { *((char*)dest + n) = *((char*)src + n); } } else { size_t i = 0; while (i 
              
             
            
           
          
         
        
      
     
     
    
    
   
   
  
  

以上就是关于字符串函数的实现,当然还有一些没有实现,后期会慢慢补充,如果那里有错误,还望读者不吝赐教。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值