【C言語】strlen()関数

目次

1. strlen() 関数の概要

2 番目に、strlen() 関数の具体的な使用法

3. strlen関数使用時の注意点 

4. strlenの機能を実現する3つの方法

1. カウンターのやり方

2. 再帰的な方法

3. ポインタマイナスポインタの方法

要約する


1. strlen() 関数の概要

strlen 関数: 文字列 str の長さを計算し、文字の最初のアドレスからたどり、'\0' で終わり、'\0' を含まない計算された長さを返します。ライブラリ内の strlen() 関数は次のとおりです。

size_t strlen (const char* str);

  1. 関数のパラメータは ------const char* str: 文字ポインタです。
  2. 戻り値の型 ------ 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' より前の文字数を返すため、文字配列の初期化を標準化する必要があります。 

おすすめ

転載: blog.csdn.net/weixin_47970952/article/details/126149644