C 语言--字符串操作函数--笔记(1)

</pre><pre name="code" class="objc">
#include"stdio.h"
#include"assert.h"
/**
'\0' --字符串结束符
*/
int my_strlen(char* const s);
char* my_strcpy(char* dest,const char* src);
int my_strcmp(const char *str1,const char* str2);
char* my_strcat(char* dest,const char* src );
char* my_strstr(const char *s1,const char *s2);
char*my_strncat(char *dest, const char *src, int n);
char* my_substr(char* dest,const char* str,int a,int b);
//-----------------------------------------------------------------------------------------------------------//
void main(){
   char* st="dsafdsff";///---这里的字符串是常量,在常量池中。不是在栈中--不可变
   char str[]="abcde"; //这里数组大小为5个,编译器根据读出字符串大小给数组分配空间大小----这里的字符串在栈中,在栈中申请的空间存储的--可变
   char dest[]="a";       //--假如这里用字符指针,则下面的字符串复制不能成功
						 //注意:存储字符串的目的地要用字符数组。
    //这里定义dest数组很有问题吗,这里定义了一个字符数组dest,但是只有一个字符的空间存储。
   //my_strcat(dest,str),---这个字符串拼接导致dest要存储的数据增加--这样就会溢出,导致拼接后的字符串会占用更多的栈空间,这就可以和其他数据重叠了。
   
                      
   char* str2="1hasfdsd";
    printf("%s", my_strcat(dest,str));
 while(1);
}
//-----------------------------------------------------------------------------------------------------------//
//求字符串长度
int my_strlen(char* const s){ 
      int i=0;
	  for(i;s[i];i++);
	  return i;
	//or  while(s[i]){i++;} return i;
	  	
}
//-----------------------------------------------------------------------------------------------------------//
//复制字符串--是字符串值的复制,而不是简单的指针复制
//Note:传入的dest不能是字符指针,因为字符指针指向的常量字符串,它的值是不能改变的。
//了解:另外strdup()也是复制字符串函数,由malloc()动态分配,无需事先初始化指针,但不是标准c库函数,而且缺点很多--不建议用这个函数
char* my_strcpy(char* dest,const char* src){
       
       //0-最简单的实现如下
      assert(src);//断言函数,如果值为假,则将打印错误信息并退出程序
      assert(dest!=NULL); //或者assert(src!=NULL && dest!=NULL);
char* dest_tmp=dest;
     while((*dest++ = *src++)!='\0');//while((* dest = * src) != '\0'){dest++;src++;}   
    return dest_tmp;
}
//-----------------------------------------------------------------------------------------------------------//
//字符串比较函数
int my_strcmp(const char *str1,const char* str2){
	assert(str1!=NULL && str2!=NULL);
	
	while(*str1!='\0' ||*str2!='\0'){
		if(*str1>*str2){
		   return 1;
		}else if(*str1<*str2){
		return -1;
		}else{
			if(*str1=='\0') return 0;
		str1++;
		str2++;

     ///if(*str1=='\0' && *str2=='\0') return 0;//这句话用下面的return 0;替代
		}
	}
 return 0;//这里可以替代上面的一句
}

//-----------------------------------------------------------------------------------------------------------//
//追加字符串--拼接字符串    //不能改变src的字符串值,可以加const
//eg: 输入 abc  de  得到 abcde
char* my_strcat(char* dest,const char* src ){
  assert(dest!=NULL && src!=NULL);
/*	char *tmp=dest;
	while(*dest++); //while(*tmp++);
	while(*src){ *dest++=*src++;}//means --	while( (*tmp++=*src++)!='\0');
		return tmp;//---也可以把*/
  //这个正确
	char *tmp=dest;
	while(*tmp)tmp++; //while(*tmp++);
	while( *tmp++ = *src++);//means --while( (*tmp++=*src++)!='\0');
	return dest;
}
//-----------------------------------------------------------------------------------------------------------//
//字符串拼接----strSource字符串的前n个字符串添加到dest后面
char *my_strncat(char *dest, const char *src, int n){
    char *tmp=dest;

    while(*tmp) tmp++;
    while((n--)&&(*tmp++ = *src++)); //n要在前面
  return dest;
} 
//-----------------------------------------------------------------------------------------------------------//
//  strstr()字符串中查找特定子字符串第一次出现的位置--返回该位置的指针
//----下面这个方法很普通--查看数据结构KMP算法更加
char * my_strstr(const char *s1,const char *s2)
{
   if (*s1 == 0)
    {
      if (*s2)
        return (char *) NULL;
      return (char *) s1;
    }
   while (*s1)
   {
      size_t i;
      i = 0;
      while (1)
      {
        if (s2[i] == 0)
        {
           return (char *) s1;
        }
        if (s2[i] != s1[i])
        {
           break;
        }
        i++;
      }
      s1++;
   }
   return (char *) NULL;
}
//-----------------------------------------------------------------------------------------------------------//
//取出字符串的子串
char* my_substr(char* dest,const char* str,int a,int b){
     assert(str!=NULL);
     char*tmp=dest;
	 
	 int k=0;
	 while(*tmp)tmp++;
	 while(k!=a){str++;k++;}
//	 printf("k=%d  ",k);
	 while( k<=b)   //有错误,没找到??--原因:dest和str很容易重叠,
	 { // 因此输出还会出现乱码。--这点要解决---重叠问题-//查看memcpy(dest,src,strlen(src)+1); 
	    *tmp=*str;
          if(k==b)break;
		   k++;
		  tmp++;
		   str++;
	 }
	 return dest;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值