1. strcmp 関数の実装をシミュレートします。この関数は、char arr1[] = "abcd"、char arr2[] = "abcq"、strcmp(arr1, arr2) などの 2 つの文字列のサイズを比較するために使用されます。文字に基づく 最初の配列の文字の ASCll 値が 2 番目の配列の ASCll 値より大きい場合は、> を返します; 最初の配列の文字の ASCll 値が 2 番目の配列の文字の ASCll 値より小さい場合は、 2 番目の配列、return <、2 つの配列内の文字の ASCll が等しい場合、return =、明らかに q の ASCll 値が d の ASCll 値より大きい、return <、
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while(*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return (*str1 - *str2);
}
int main()
{
char arr1[20] = "abcd";
char arr2[20] = "abcq";
int ret = my_strcmp(arr1, arr2);
if (ret < 0)
printf("<\n");
else if (ret == 0)
printf("==\n");
else
printf(">\n");
return 0;
}
2. strstr 関数の実装をシミュレートします。まず、この関数が何に使用されるかを理解する必要があります。この関数は部分文字列を検索するために使用されます。つまり、文字列内の部分文字列を検索し、見つかった場合は出力します。
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = str1;
const char* s2 = str2;
const char* p = str1;
while (*p)
{
s1 = p;
s2 = str2;
while (*s1 != '\0' && *s2 != '\0'&&*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)p;
}
p++;
}
return NULL;
}
int main()
{
char arr1[] = "abcde";
char arr2[] = "cde";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
3. memcpy 関数をシミュレートします。memcpy は何に使用されますか? これはメモリのコピーに使用され、strcpy は文字列のコピーに使用できますが、配列の内容を別の配列にコピーする場合はどうなるでしょうか? このとき、memcpy関数を使用することでarr1の内容をarr2にコピーすることができます。
void* my_memcpy(void* dest,const void* src,size_t num)
{
assert(dest && src);
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 24);
int i = 0;
for (i = 0; i < 6; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
4. 上で述べたように、memcpy はメモリをコピーできますが、メモリのオーバーラップについてはどうすればよいでしょうか? このとき、メモリの重複をコピーできるmemmove関数を使用します。
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
if(dest<=src||((char*)dest>(char*)src+num))
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
else
{
dest = (char*)dest + num - 1;
src = (char*)src + num - 1;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1+2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}