シミュレーションはcライブラリ関数strcpy,strcat,strstrstr,strcmp,memcpy,memmoveを実現する
9753 ワード
目次 strcpy strcat strstr strcmp memcpy memmove
strcpy
strcpyは文字列レプリケーション関数であり、src(ソース文字列ポインタ)アドレスから始まり'0'終端子を含む文字列をdst(宛先文字列ポインタ)で始まるアドレス空間にレプリケーションする.注意:コピーは、文字列終了識別子'0'とともにコピーされます.文字列のみコピー
strcat
strcatは文字列接続に使用される関数で、パラメータsrc文字列をパラメータdstが指す文字列の末尾にコピーします.dstの最後の終了文字NULLは上書きされ、接続後の文字列の末尾にNULLが追加されます.注意:dstとsrcが指すメモリ領域はオーバーラップせず、dstはコピーする文字列を収容するのに十分な空間が必要です.
strstr
strstrは、文字列str 1から文字列str 2関数があるかどうかを検索します.str 2がstr 1のサブストリングである場合、str 1にサブストリングが初めて現れる位置を決定し、この位置のアドレスを返す.サブストリングでない場合はNULLを返します.
strcmp
strcmpは、2つの文字列s 1とs 2を比較するために使用され、s 1>s 2の場合、1を返す.s 1==s 2、0を返します.
memcpy
注意!memcpyを使用する場合は、ソースとターゲットのメモリ領域が重複しないことを保証します.機能cとc++で使用するメモリコピー関数.ソースsが指すメモリアドレスの開始位置からnバイトのコピーをターゲットstrが指すメモリアドレスの開始位置に開始するmemcpyとstrcpyは以下の違いがある:1.コピー内容が違います.strcpyは文字列をコピーし、memcpyは文字配列、整数、構造体、クラスなどをコピーします.2.コピー方法が異なる.strcpyはコピーされた文字列の'0'が終了し(オーバーフローする可能性があります)、memcpyは3番目のパラメータによってコピーの長さを決定します.
memmove
memmoveはsrcからcountバイトをdstにコピーするために使用され、ターゲット領域とソース領域が重複している場合、memmoveはソース列が上書きされる前に重複領域のバイトをターゲット領域にコピーすることを保証することができる.ただし、コピーするとsrcの内容が変更されます.ただし、ターゲット領域とソース領域が重複していない場合はmemcpy関数と同様です.
間違いがあればご指摘ください^v^
strcpy
strcpyは文字列レプリケーション関数であり、src(ソース文字列ポインタ)アドレスから始まり'0'終端子を含む文字列をdst(宛先文字列ポインタ)で始まるアドレス空間にレプリケーションする.注意:コピーは、文字列終了識別子'0'とともにコピーされます.文字列のみコピー
char * My_strcpy(char* dst, const char* src)
{
char * start = dst;
assert(dst&&src);
while (*dst = *src)
{
dst++;
src++;
}
return start;
}
int main()
{
char arr1[] = "hello";
char arr2[] = "world";
My_strcpy(arr1, arr2);
printf("%s
", arr1);
system("pause");
return 0;
}
strcat
strcatは文字列接続に使用される関数で、パラメータsrc文字列をパラメータdstが指す文字列の末尾にコピーします.dstの最後の終了文字NULLは上書きされ、接続後の文字列の末尾にNULLが追加されます.注意:dstとsrcが指すメモリ領域はオーバーラップせず、dstはコピーする文字列を収容するのに十分な空間が必要です.
char* My_strcat(char* dst, const char* src)
{
char* start = dst;
assert(dst&&src);
while (*dst)
{
dst++;
}
while (*dst = *src)
{
dst++;
src++;
}
return start;
}
int main()
{
char arr1[] = "hello";
char arr2[] = "world";
My_strcat(arr1, arr2);
printf("%s
", arr1);
system("pause");
return 0;
}
strstr
strstrは、文字列str 1から文字列str 2関数があるかどうかを検索します.str 2がstr 1のサブストリングである場合、str 1にサブストリングが初めて現れる位置を決定し、この位置のアドレスを返す.サブストリングでない場合はNULLを返します.
char* My_strstr(char*dst,char*src)
{
char *ptr = dst;
assert(dst&&src);
while(*ptr)
{
char*p1 = ptr;
char*p2 = src;
while ((*p1) && (*p2) && (*p1 == *p2))
{
p1++;
p2++;
}
if (*p2 == '\0')
{
return (char*)ptr;
}
ptr++;
}
return NULL;
}
int main()
{
char arr1[] = "hello world";
char arr2[] = "world";
char* ret = My_strstr(arr1,arr2);
if (ret == NULL)
{
printf("
");
}
else
{
printf("%s
", ret);
}
system("pause");
return 0;
}
strcmp
strcmpは、2つの文字列s 1とs 2を比較するために使用され、s 1>s 2の場合、1を返す.s 1==s 2、0を返します.
char* My_strcmp(const char*s1, const char*s2)
{
assert(s1&&s2);
while ((*s1==*s2))
{
if (*s1 == '\0')
{
return 0;
}
s1++;
s2++;
}
if (*s1 > *s2)
{
return -1;
}
else
{
return 1;
}
}
int main()
{
char arr1[] = "hello world";
char arr2[] = "world";
int ret = My_strcmp(arr1, arr2);
printf("%d
", ret);
system("pause");
return 0;
}
memcpy
注意!memcpyを使用する場合は、ソースとターゲットのメモリ領域が重複しないことを保証します.機能cとc++で使用するメモリコピー関数.ソースsが指すメモリアドレスの開始位置からnバイトのコピーをターゲットstrが指すメモリアドレスの開始位置に開始するmemcpyとstrcpyは以下の違いがある:1.コピー内容が違います.strcpyは文字列をコピーし、memcpyは文字配列、整数、構造体、クラスなどをコピーします.2.コピー方法が異なる.strcpyはコピーされた文字列の'0'が終了し(オーバーフローする可能性があります)、memcpyは3番目のパラメータによってコピーの長さを決定します.
void* My_memcpy(void* dst, void* src, size_t n)
{
void* start = dst;
while (n--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return start;
}
int main()
{
char arr1[] = "hello";
char arr2[] = "hi";
My_memcpy(arr1, arr2, 5);
printf("%s
", arr1);
system("pause");
return 0;
}
memmove
memmoveはsrcからcountバイトをdstにコピーするために使用され、ターゲット領域とソース領域が重複している場合、memmoveはソース列が上書きされる前に重複領域のバイトをターゲット領域にコピーすることを保証することができる.ただし、コピーするとsrcの内容が変更されます.ただし、ターゲット領域とソース領域が重複していない場合はmemcpy関数と同様です.
void* My_memmove(void* dst, const void* src, size_t n)
{
char* pdst =(char*) dst;
char* psrc = (char*)src;
assert(dst&&src);
if (pdst <= psrc&& pdst >= psrc + n)// ;
{
while (n--)
{
*pdst = *psrc;
}
}
else// ;
{
while (n--)
{
*(pdst + n) = *(psrc + n);
}
}
return dst;
}
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "hijklmn";
char arr3[10] = { 0 };
My_memmove(arr3, arr1, 7);
My_memmove(arr1+2, arr1, 3);
printf(" :%s
", arr3);
printf(" :%s
", arr1);
system("pause");
return 0;
}
間違いがあればご指摘ください^v^