【C言語】文字列関数の実装(strcpy,strcat,strcmp,strstrstrstr,strlen)

20795 ワード

strシリーズ文字列関数の実装
  • strlen関数の実装
  • strcpy関数の実装
  • strcat関数の実装
  • strcmp関数の実装
  • strstrstr関数の実装
  • strnシリーズ関数(strncmp,strncpy,strncat)のシミュレーション実装https://blog.csdn.net/weixin_43939593/article/details/104123855memシリーズ関数(memcpy,memmove,memcmp)のシミュレーション実装https://blog.csdn.net/weixin_43939593/article/details/104132703
    まず各関数について簡単に紹介します(コード実装は後述)
    strlen
    関数のプロトタイプ:
     	size_t strlen(const char* str)
    
  • 文字列のサイズを計算し、終了フラグ
  • として末尾'0'を用いる.
  • 文字列の長さは計算されません'0'
  • 戻りタイプは、符号なし整数(負ではないため)
  • である.
    strcpy
    関数のプロトタイプ:
    	char* strcpy (char* destination, const char* source)
    
  • ソース文字列の文字sourceオーバーライド式の書き込みターゲット文字列destination,’0’もターゲット文字列
  • にコピーする.
  • ターゲット文字列destinationには、
  • の十分なスペースが必要です.
  • ソース文字列の場合、最後の'0'もターゲット文字列
  • にコピーされます.
    strcat
    関数のプロトタイプ:
    	char* strcat (char* destination, const char* source)
    
  • ソース文字列source追加式をターゲット文字列destinationの後に書き込む、'0'
  • を含む
  • ターゲット文字列は、十分なスペースでなければなりません.そうしないと、境界を越えます.

  • strcmp
    関数のプロトタイプ:
    	int strcmp(const char*  str1, const char* str2)
    
  • は文字列の比較を行い、前後の各ビットのASCIIコードに従って
  • を比較する.
  • str 1>str 2は1を返します.str 1==str 2は0を返します.Srt 1を返す
    strstr
    関数のプロトタイプ:
     	char* strstr(const char*str1, const char* str2)
    
  • はstr 2がstr 1のサブストリングであるか否かを判断し、str 2がstr 1のサブストリングである場合、str 1文字列のうちstr 2文字列でstr 1文字列の末尾部分
  • に戻る.
  • str 2がstr 1のサブストリングでない場合、NULL
  • に戻る
    関数の実装
    #include 
    #include 
    
    // strlen    
    
    //          
    size_t my_strlen(const char* str)
    {
    	assert(str);          //     
    	size_t count = 0;
    	while(*str != '\0')
    	{
    		count++;
    		str++;
    	}
    	return count;
    }
    //       
    size_t my_strlen1(const char* str)
    {
    	assert(str);          //     
    	if(*str == '\0')
    	{
    		return 0;
    	}
    	else 
    		return 1 + my_strlen(str+1);
    }
    //         
    size_t my_strlen2(const char* str)
    {
    	assert(str);          //     
    	char* begin = str;  //        
    	while(*++str);  // str    '\0'   
    	return str - begin; //           
    }
    // strcmp    
    
    //    :
    char* my_strcmp(char* dst, const char* src)
    {
    	assert(dst&&src);  //      
    	char* ret = dst;  //      
    	while(*dst++ = *src++);
    	return ret;
    	
    }
    //    :
    char* my_strcpy1(char* dst, const char* src)
    {
    	assert(dst&&src); //     
    	char* ret = dst;  //       
    	while (*src)      //  *src  '\0',      
    	{
    		*dst = *src;
    		dst++;
    		src++;
    	}
    	*dst = '\0';     //dst        '\0'
    	return ret;
    }
    
    // strcat    
    
    //    :
    char* my_strcat(char* dst, const char* src)
    {
    	assert(dst&&src);
    	char* ret = dst;
    	while(*dst++);  // dst  '\0’       
    	--dst;
    	while(*dst++ = *src++);
    	return ret;
    }
    
    //   
    char* my_strcat1(char* dst, const cha* src)
    {
    	assert(dst&&src);
    	size_t count = 0;
    	while(dst[count])  //  dst   
    	{
    		count++;  
    	}
    	dst += count;  		// dst      '\0’
    	while(*dst++ = *src++); // src '\0'      
    	return dst; 
    	
    }
    
    // strcmp  
    
    int my_strcmp(const char* str1, const char* str2)
    {
    	assert(str1&&str2);
    	while(*str1 != '\0' && *str2 != '\0' )
    	{
    		if(*(unsigned char*)str1 > *(unsigned char*)str2)
    		{
    			return 1;
    		}
    		if(*(unsigned char*)str1 < *(unsigned char*)str2)
    		{
    			return -1;
    		}
    		else 
    		{
    			str1++;
    			str2++;
    		}
    	}
    	if(*str1 == '\0' && *str2 != '\0')
    	{
    		return -1;
    	}
    	else if(*str1 != '\0' && *str2 == '\0')
    	{
    		return  1;
    	}
    	else
    		return  0;
    }
    
    // strstr       
    char* my_strstr(const char* str1, const char* str2)
    {
    	assert(str1&&str2);
    	while(*str1)
    	{
    		char* begin = str1;
    		while(*begin != '\0' && *begin == *str2)
    		{
    			begin++;
    			str2++;
    		}
    		if(*str2=='\0')
    		{
    			return str1;
    		}
    		str1++;
    	}
    	return NULL;
    }