【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
関数のプロトタイプ:文字列のサイズを計算し、終了フラグ として末尾'0'を用いる.文字列の長さは計算されません'0' 戻りタイプは、符号なし整数(負ではないため) である.
strcpy
関数のプロトタイプ:ソース文字列の文字sourceオーバーライド式の書き込みターゲット文字列destination,’0’もターゲット文字列 にコピーする.ターゲット文字列destinationには、 の十分なスペースが必要です.ソース文字列の場合、最後の'0'もターゲット文字列 にコピーされます.
strcat
関数のプロトタイプ:ソース文字列source追加式をターゲット文字列destinationの後に書き込む、'0' を含むターゲット文字列は、十分なスペースでなければなりません.そうしないと、境界を越えます.
strcmp
関数のプロトタイプ:は文字列の比較を行い、前後の各ビットのASCIIコードに従って を比較する. str 1>str 2は1を返します.str 1==str 2は0を返します.Srt 1を返す
strstr
関数のプロトタイプ: はstr 2がstr 1のサブストリングであるか否かを判断し、str 2がstr 1のサブストリングである場合、str 1文字列のうちstr 2文字列でstr 1文字列の末尾部分 に戻る. str 2がstr 1のサブストリングでない場合、NULL に戻る
関数の実装
まず各関数について簡単に紹介します(コード実装は後述)
strlen
関数のプロトタイプ:
size_t strlen(const char* str)
strcpy
関数のプロトタイプ:
char* strcpy (char* destination, const char* source)
strcat
関数のプロトタイプ:
char* strcat (char* destination, const char* source)
strcmp
関数のプロトタイプ:
int strcmp(const char* str1, const char* str2)
strstr
関数のプロトタイプ:
char* strstr(const char*str1, const char* str2)
関数の実装
#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;
}