C言語ライブラリ関数のC/C++ナニーレベルの説明---文字列関数+実装

 ホームページ

まだまだ未知の部分が探索を待っている_データ構造、C言語の難しさ、小規模プロジェクト - CSDNブログ

トピックコラム---C言語の難しさ

C 言語の難しさ_探索を待っている未知のブログがまだあります - CSDN ブログ

ご協力ありがとうございました!

目次

I.はじめに

2. 説明

1. 文字列長関数 (strlen) を見つけます。

1) 使用方法: 

2)注意点:

 2. 文字列コピー関数(strcpy)の長さに制限はない

1) 使用方法: 

2)注意点:

 3. 文字列追加関数(strcat)の長さに制限はありません 

1) 使用方法: 

2)注意点:

4. 文字列比較関数(strcmp)の長さに制限はありません

1) 使用方法: 

2)注意点:

5. 文字列関数(strstr)の長さに制限はありません

1) 使用方法: 

2)注意点:

3. 個別の実装 

 1. 文字列の長さを求める関数の実装(strcpy)

1. ループ

2. 再帰 

3. ポインタ演算 

 2. その他は自分で実装可能


I.はじめに

日常的な使用では、文字列の長さの計算、文字列のコピーなど、文字列に対する操作が比較的頻繁に行われます。これらの関数の実装はそれほど面倒ではありませんが、いくつかのライブラリ関数を直接呼び出すことができれば、コード サイズの点で比較的簡単になります。さて、早速説明に入りましょう。

2. 説明

注: 次のライブラリ関数のヘッダー ファイルは string.h です。

1. 文字列長関数 (strlen) を見つけます。

1) 使用方法: 

パラメータは、要求された文字列へのポインタです。

2)注意点:

strlen の終了条件は、'\0' の検出 ('\0' を除く) です。

戻り値の型は符号なし整数です (符号なし整数 - 符号なし整数は常に 0 以上です)。

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[] = "strstr";
	char str2[] = "str\0str";
	printf("str1:%d\n",strlen(str1));
    printf("str2:%d\n",strlen(str2));
	return 0;
}

 2. 文字列コピー関数(strcpy)の長さに制限はない

1) 使用方法: 

destination はコピー先の配列、source はコピーされる配列です。

2)注意点:

char* の宛先スペースは十分な大きさがあり、変更可能である必要があります。同様に、'\0' に遭遇すると終了します。

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[7];//destination
	char str2[] = "str\0str";//source
	strcpy(str1, str2);
	printf("str1:%s\n",str1);
	printf("str2:%s\n",str2);
	return 0;
}

 3. 文字列追加関数(strcat)の長さに制限はありません 

1) 使用方法: 

 ソース文字列を宛先に追加します。

2)注意点:

宛先のスペースサイズが十分である必要があることに注意してください。

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[7]="str";
	char str2[] = "str\0str";
	strcat(str1, str2);
	printf("str1:%s\n", str1);
	printf("str2:%s\n", str2);
	return 0;
}

4. 文字列比較関数(strcmp)の長さに制限はありません

1) 使用方法: 

str1 と str2 を比較します。

2)注意点:

strcmp が比較するのは文字列の長さではなく、その ASCII コード値です。(str1 の最初の文字と str2 の最初の文字の ASCII コード値を比較します。小さい場合は <0 を返し、大きい場合は >0 を返します。等しい場合は次の文字を比較し、上記と同様にします。 )

#include<stdio.h>
#include<string.h>
int main()
{
    //判断str1和str2的大小关系,并打印大小关系符
	char str1[7] = "str";
	char str2[] = "str\0str";
	int ret = strcmp(str1, str2);
	if (ret > 0)
		printf(">");
	else if (ret < 0)
		printf("<");
	else
		printf("=");
	
	return 0;
}

5. 文字列関数(strstr)の長さに制限はありません

1) 使用方法: 

 str1 に文字列 str2 が含まれるかどうかを検索し、str1 で返された文字列のアドレスを見つけます。

2)注意点:

strstr(str1,str2) の戻り値を使用または処理する前に、str1 文字列を変更しないように注意してください。変更する場合は、戻り値が使用されるまで待つ必要があります。

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[7] = "strcmp";
	char str2[] = "str";
	char*ret = strstr(str1, str2);
	if (ret == NULL)
		printf("未找到\n");
	else
	{
		printf("%s", ret);
	}
	return 0;
}

3. 個別の実装 

 1. 文字列の長さを求める関数の実装(strcpy)

 この関数の実装は比較的単純で、さまざまな方法で実装できます。

1. ループ

#include<stdio.h>
int my_strlen2(char* arr)
{
	int i = 0;
	while (*(arr + i) != '\0')//如果遇到'\0'结束,'\0'不算作字符串长度
		i++;
	return i;
}
int main()
{
	char arr[] = "abcdef";
	int ret2 = my_strlen2(arr);
	printf("迭代:%d\n", ret2);
	return 0;
}

2. 再帰 

#include<stdio.h>
int my_strlen1(char* arr)
{
	if (*arr != '\0')
		return 1 + my_strlen1(arr + 1);
	else
		return 0;
}
int main()
{
	char arr[] = "abcdef";
	int ret1 = my_strlen1(arr);
	printf("%d\n", ret1);//递归:
	return 0;
}

3. ポインタ演算 

2 つのポインタの減算は、メモリ内の 2 つのアドレス間のポインタ タイプのバイト倍数に等しくなります。どちらのポインターも文字配列を指しているため、配列は連続しており、要素の数を表すことができます。

#include<stdio.h>
char* my_strlen(char* arr)
{
	char*p=arr;
	while(*p!='\0')
		p++;
	return p;
}
int main()
{
	char arr[] = "abcdef";
	char* ret = my_strlen(arr);
	printf("%d\n", ret-arr);
	return 0;
}

 2. その他は自分で実装可能

 ヒント: strstr の暴力的な解決法に加えて、KMP アルゴリズムを使用することもできます。

おすすめ

転載: blog.csdn.net/qq_73435980/article/details/133419392