目次
1. strlen() 関数の概要
strlen 関数: 文字列 str の長さを計算し、文字の最初のアドレスからたどり、'\0' で終わり、'\0' を含まない計算された長さを返します。ライブラリ内の strlen() 関数は次のとおりです。
size_t strlen (const char* str);
- 関数のパラメータは ------const char* str: 文字ポインタです。
- 戻り値の型 ------ size_t: 符号なし整数 (つまり、unsigned int)
前提知識:
- const キーワード: 定数を定義するために使用され、const キーワードによって変数が変更された場合、この変数の値は変更できません。したがって、ここでの * str の値は変更できません。
- size_t データ型: C のオブジェクトが達成できる最大長を表し、符号なし整数です。
1. const キーワードを使用します。これは、文字列の長さを計算し、元の文字列の変更を避けるために const で変更するだけです。
2. size_t データ型を使用します。ここでは、計算された文字列の長さが返されます。最小の長さは 0 で、負の値にすることはできません。
2 番目に、strlen() 関数の具体的な使用法
シーン 1:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[10] = "abcde";
int num = strlen(arr);
printf("数组arr的长度为:%d\n", num);
return 0;
}
出力結果:
シーン 2:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = { 'a','b','c','d','e' };
int num = strlen(arr);
printf("数组arr的长度:%d\n", num);
return 0;
}
出力結果:
上記 2 つのシナリオの出力結果は同じではありません
なぜこのような結果になるのでしょうか? strlen 関数を使用する際にはどのような点に注意する必要がありますか?
3. strlen関数使用時の注意点
strlen 関数: 長さを計算する場合、'\0' が検出された場合にのみ計算が停止され、計算された長さに '\0' が含まれません。
シナリオ 1、文字列が arr 文字配列に格納されている (文字列は '\0' で終わる)、strlen が文字 'e' までトラバースし、その後逆方向にトラバースすると、'\0' に遭遇します。この時点で、strlen はトラバースを停止し、文字数 5 を返します。
シナリオ 2: 5 つの文字 'a'、'b'、'c'、'd'、および 'e' が arr の文字配列に順番に格納され、'\0' は格納されないため、'e' ' 文字はその後に保存されます。そこに何が入っているのかわかりません。strlen 関数は「\0」に遭遇した場合にのみ停止するため、返される数値はランダムな値になります。
したがって、strlen 関数を使用するときは、文字配列が '\0' で終わるかどうかを確認する必要があります。
4. strlenの機能を実現する3つの方法
1. カウンターのやり方
コードは以下のように表示されます。
#include <stdio.h>
#include <assert.h>
int count_strlen(const char* p)
{
assert(p != NULL);
int count = 0;
while (*p != '\0')
{
count++;
p++;
}
return count;
}
int main()
{
char arr1[] = "abcdefg";
int num1=count_strlen(arr1);
printf("字符串arr1的长度为:%d\n", num1);
return 0;
}
出力結果:
補足知識:assert(アサート):マクロです。
Assert の機能は、括弧内の式を計算し、その値が false (つまり 0) の場合、エラー メッセージを出力し、プログラムの動作を終了することです。ここでのアサートは、ポインタ p が NULL にならないようにすることです。
2. 再帰的な方法
コードは以下のように表示されます。
#include <stdio.h>
#include <assert.h>
int recursion_strlen(char* p)
{
assert(p != NULL);
if (*p != '\0')
{
return 1 + recursion_strlen(++p);
}
else
{
return 0;
}
}
int main()
{
char arr2[] = "abcdef";
int num2 = recursion_strlen(arr2);
printf("字符串arr2的长度为:%d\n", num2);
return 0;
}
出力結果:
3. ポインタマイナスポインタの方法
コードは以下のように表示されます。
#include <stdio.h>
#include <assert.h>
int point_strlen(char* p)
{
assert(p != NULL);
char* start = p;
while (*p != '\0')
{
p++;
}
return p - start;
}
int main()
{
char arr3[] = "abcd";
int num3 = point_strlen(arr3);
printf("字符串arr3的长度为:%d\n", num3);
return 0;
}
出力結果:
要約する
strlen() 関数: '\0' より前の文字数を返すため、文字配列の初期化を標準化する必要があります。