文字列関数シミュレーションの実装
strlenの導入と実装
strlen
この機能は文字列の長さを見つけることです。文字列の終了マークは であるため'\0'
、前に出現した文字数がstrlen
カウントされます。'\0'
さらに、strlen
関数の戻り値の型がsize_t
型、つまり符号なし整数であることにも注意する必要があります。次のコードを見てみましょう。
#include<stdio.h>
#include<string.h>
int main()
{
if(strlen("abc") - strlen("abcdef") > 0)
printf(">\n");
else
printf("<=\n");
return 0;
}
このコード部分を見ると、必ず3 - 6 < 0
画面に表示されるだろうと言う人がいるでしょう<=
が、実際には表示されます>
。strlen
符号なし数値が返されるため、2 つの符号なし数値の減算の結果の型もsize_t
クラスの符号なし数値である必要があります。したがって、2 つの数値を減算した結果は-3
、0 より大きい符号なしの数値として扱われます。
要約すると、strlen
関数をシミュレーションして実装するときは、次の点に注意する必要があります。
- 文字列の長さを正しく取得するには、文字列に次のものが含まれている必要があります。
'\0'
- 注意すべき
strlen
戻り値の型は次のとおりですsize_t
方法 1:
#include<stdio.h>
size_t my_strlen(const char* str)
{
size_t count=0; //计数器,统计字符串长度
assert(str != NULL);
while(*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr1[]="abcdef";
size_t len=my_strlen(arr1);
return 0;
}
方法 2:
ポインタ - ポインタ -----> アドレス - アドレス: 取得するのは、ポインタとポインタの間の要素の数です。
#include<stdio.h>
size_t my_strlen(const char* str)
{
assert(p != NULL);
char* cur=str;
while(*cur != '\0')
{
cur++;
}
return cur - str;
}
int main()
{
char arr1[]="abcdef";
size_t len=my_strlen(arr1);
return 0;
}
方法 3:
再帰的 (一時変数は作成されません)
#include<stdio.h>
size_t my_strlen(const char* str)
{
if(*str != '\0')
return 1+my_strlen(str+1);
else
return 0;
}
int main()
{
char arr1[]="abcdef";
size_t len=my_strlen(arr1);
return 0;
}
strcpyの導入と実装
strcpy
関数はある文字列を別の文字列にコピーする関数、文字列をコピーすると、文字列の終了マーク'\0'
もコピーされます。。ここで参照するのdestination
はターゲット文字列、つまり文字列をコピーする先の文字列です。source
これはソース文字列、つまりコピーする必要がある文字列を指します。このソース文字は変更する必要がないため、const
エラーを避けるために変更を使用します。
この関数の戻り値は、char*
コピーされた文字列を指すポインターです。
上記の紹介を通じて、strcpy
機能をシミュレートおよび実装する際には次の点に注意する必要があります。
- ソース文字列を含める必要があり
'\0'
、'\0'
コピー先スペースにもコピーされます。 - ターゲット領域が、コピーされたデータを保持するのに十分な大きさであることを確認してください。
- ターゲットスペースが変更可能であることを確認してください
#include<stdio.h>
#include<assert.h>
void my_strcpy(char* dest,const char* src)
{
assert(dest && src);
while(*dest++ = *src++)
{
;
}
}
int main()
{
char arr1[]="abcdef";
char arr2[20]={
0};
my_strcpy(arr1,arr2);
return 0;
}