劣化していく自分と向き合うにはもう少し勇気が必要
皆さんこんにちは、ジニンです。
この記事では、5 つの主要な文字列処理関数のシミュレーション実装について説明します。
記事ディレクトリ
1. strlen関数のシミュレーション実装
strlen の機能は、文字列の長さを見つけることです。
strlen の関数プロトタイプ
通常の方法
'\0' を見つけて、文字列の最初のアドレスを渡します。逆参照された値が '\0' ではない場合、ポインタの位置は後方に移動し、逆参照された値がポインタが '\0' の場合、ループは停止し、関数はカウンタ カウントの値を返します。
size_t my_strlen(char* str)
{
size_t count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char str[1000] = "I have a my_strlen hanshu";
size_t len = my_strlen(str);
printf("%zu", len);
return 0;
}
ポインタマイナスポインタ
文字列の最初の要素のアドレスを渡した後、まず文字ポインタを付けて保存し、次に保存したポインタを移動して '\0' を見つけ、'\0' を見つけた後、文字列の最初の要素のアドレスを減算します。この位置のポインタからの文字列の長さ
ポインタからポインタを引いた値が、2つのポインタ間の要素数となります。
size_t my_strlen(char* str)
{
char* str2 = str;
while (*str2 != '\0')
str2++;
return str2 - str;
}
int main()
{
char str[1000] = "I have a my_strlen hanshu";
size_t len = my_strlen(str);
printf("%zu", len);
return 0;
}
再帰
再帰的手法の核心は、大きなものを小さくすることです
ただし、再帰には条件が必要であり、再帰ごとにこの条件にどんどん近づいていく必要があることに注意してください。
渡されたポインタが '\0' に逆参照されると、再帰が終了することを意味します。それ以外の場合、ポインタは後方に移動して再帰を継続します。
size_t my_strlen(char* str)
{
if (*str == '\0')
return 0;
else
return my_strlen(str + 1) + 1;
}
int main()
{
char str[1000] = "I have a my_strlen hanshu";
size_t len = my_strlen(str);
printf("%zu", len);
return 0;
}
2. strcpy関数のシミュレーション実装
strcpy 関数の機能は、文字列をコピーすることです。
strcpyの関数プロトタイプ
予防:
- 文字列をコピーするには、「\0」もコピーする必要があります
- ターゲット文字列は定数文字列ではなく変数である必要があります
- この関数はターゲット文字列の最初のアドレスを返すため、最初のアドレスを最初に保存する必要があります。
#include<assert.h>
char* my_strcpy(char* str1, const char* str2)
{
assert(str1 && str2);
char* ret = str1;
while (*str2 != '\0')
{
*str1 = *str2;
str1++;
str2++;
}
*str1 = *str2;
return str1;
}
int main()
{
char str1[100] = { "0" };
char str2[100] = "my_strcpy hanshu";
my_strcpy(str1, str2);
return 0;
}
3. strcmp関数のシミュレーション実装
strcmp 関数の役割は文字列を比較することです。
strcmp 関数のプロトタイプ
予防:
str1>str2 が 0 より大きい数値を返す場合、str1<str2 が 0 未満の数値を返す場合、str1=str2 が 0 を返すため、シミュレーションが実装されるとき、str1!=str2 の場合、*str1-*str2 を使用できます。 to 戻り値を示します
//实现strcmp函数
#incldue<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 && *str2)
{
if (*str2 == *str1)
{
str1++;
str2++;
}
else
return *str1 - *str2;
}
if (*str1 == *str2 && *str1 == '\0')
return 0;
}
int main()
{
char str1[100] = "abcdefg";
char str2[100] = "abcdefr";
if (my_strcmp(str1, str2) > 0)
printf("str1>str2\n");
else
printf("str2>str1\n");
return 0;
}
4. strcat関数のシミュレーション実装
strcat 関数の機能は、文字列の連結を実現することです。
strcat 関数のプロトタイプ
strcat 関数を実装するときは、まず '\0' を見つけてから、文字列コピー関数の実装を模倣して文字列をコピーする必要があります。また、'\0' もコピーする必要があります。
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* str1, const char* str2)
{
assert(str1&&str2);
char* ret = str1;
//先找str1的 \0
while (*++str1)
;
//将str2拷贝过来
while (*str2 != '\0')
{
*str1 = *str2;
str1++;
str2++;
}
*str1 = *str2;
return ret;
}
int main()
{
char arr1[100] = "jining ";
char arr2[100] = "bu shi da yuan zhong";
my_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
5. strstr関数のシミュレーション実装
strstr 関数の機能は、文字列内の部分文字列を検索することです。
strstr 関数のプロトタイプ
strstr 関数を実装するには、2 つのループを設定する必要があります。外側のループは、対象文字列のポインタ位置を制御し、部分文字列の最初の文字と同じ逆参照ポインタがあるかどうかを判断します。同じように、内側のループを使用して、部分文字列がターゲット文字列の一部であるかどうかを判断します。
#include<string.h>
char* my_strstr(const char* str1, const char* str2)
{
char* str3 = str1;
int i = 0;
for (i = 0; i < strlen(str1); i++)
{
int count = 1;
if (*(str3 + i) == *str2)
{
int j = 0;
for (j = 1; j < strlen(str2); j++)
{
if (*(str3 + i + j) == *(str2 + j) && *(str2 + j) != '\0')
count++;
}
if (count == strlen(str2))
return (str1 + i);
}
}
return NULL;
}
int main()
{
char str1[100] = "zyb is a big yuanzhong is zyb TT";
char str2[100] = "ong";
char* ret = my_strstr(str1, str2);
printf("%s", ret);
return 0;
}
ブロガーは長い間書いてきました。ブロガーを励ますために無料のトリプルコンボを与えることができれば、あなたはタイパンツを履いて本当にホットだと思います。!!