C言語 文字関数・文字列関数の詳細解説


次の文字関数と文字列関数の詳細については、この Web サイトでご覧いただけます:https://legacy.cplusplus.com/

1. 文字分類機能

機能: 文字が属する文字のタイプを決定するために使用されます
ヘッダー ファイル:#include<ctype.h>
列挙型:
ここに画像の説明を挿入します

ここでは is lower 関数を使用して、文字が小文字かどうかを判断します。

int islower ( int c );

is lower は、パラメータ部分の c が小文字であるかどうかを判断できます。
戻り値を使用して、小文字かどうかを示します。小文字の場合は 0 以外の整数を返します。小文字でない場合は 0 を返します。 。

コード:

#include<ctype.h>
#include<stdlib.h>
int main() {
    
    
	char a = getchar();
	if (islower(a))
		printf("小写");
	else
		printf("其他");
	return 0;
}

実行結果:
ここに画像の説明を挿入します
他の同様の判断もこの方法で行われます

2. 文字変換機能

次のような、小文字を大文字に交換する関数もあります。

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写 
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

試してみよう:

#include<ctype.h>
#include<stdlib.h>
int main() {
    
    
	char a = getchar();
	if (islower(a)) {
    
    
		char b = toupper(a);
		printf("%c\n", b);
	}
	else
		printf("输入的不是小写字母");
	return 0;
}

操作結果:
ここに画像の説明を挿入します

3. strlenの使い方とシミュレーション実装

パラメータと戻り値の型:

 size_t strlen ( const char * str );

1. 文字列は終了マークとして「\0」を使用し、strlen 関数は文字列内の「\0」より前に現れる文字数を返します (「\0」を除く)。
2. パラメータが指す文字列は「\0」で終わる必要があります。
3. 関数の戻り値は size_t であり、これは符号なし (エラーが発生しやすい) であることに注意してください。
4. strlen を使用するには、ヘッダー ファイル (string.h) が必要です。

使用:

#include<string.h>//包含头文件
int main() {
    
    
	char* a = "abcdef";
	size_t  te = strlen(a);//计算字符串中‘\0之前的元素个数,注意返回类型为size_t
	printf("%zd\n", te);//打印
	return 0;
}

操作結果:
ここに画像の説明を挿入します

strlen 関数をシミュレートする

1. 文字列の最初のアドレスを受け取るためにパラメータが使用される関数を作成します。戻り値の型は、strlen と同じ size_t です。
2. カウンタを設定します。文字数をカウントします。文字列をループで走査すると、「\0」に到達するまで、走査するたびにカウンタが ++ ずつ増加します。

コード:

size_t mn_strlen1(const char* s) {
    
    
	//我们不希望改变字符串 所以用const修饰,s用来接收首地址
	int i = 0;//计数器
	assert(s);
	while (*s) {
    
    //当*s为'\0'时打破循环
		i++;
		s++;//字符地址++
	}
	return i;//返回
}
int main() {
    
    
	char a[] = "abcdef";
	size_t len1 = mn_strlen1(a);
	printf("%zd\n", len1);
	return 0;
}

操作結果:
ここに画像の説明を挿入します

4. strcpyの使い方とシミュレーション実装

パラメータと戻り値の型:

 char* strcpy(char * destination, const char * source );

1. ソース文字列は「\0」で終わる必要があります。
2. ソース文字列の「\0」がターゲット スペースにコピーされます。
3. ターゲット領域は、ソース文字列を確実に保存できる程度の大きさが必要です。
4. ターゲット スペースは変更可能である必要があります。

使用:

#include<string.h>//包含头文件
int main() {
    
    
	char a[20] = {
    
     0 };//目标空间一定要够大
	char b[] = "abcdef";//字符串的‘\0'也会拷贝
	char* p = strcpy(a, b);//用p来接收返回来的地址
	printf("%s\n", p);//打印
	return 0;
}

実行結果:
ここに画像の説明を挿入します
strcpy 関数のシミュレート
1. パラメータがターゲット空間のアドレスとソース文字列アドレスである関数を作成します。戻り値はターゲット空間の最初のアドレスです
2. まず、ターゲット空間の最初のアドレスを記憶するポインタ変数を作成し、次にソース文字列内の各文字をターゲットに転送します。 space until '\0' が転送されるまで、ターゲット スペースの最初のアドレスが最終的に返されます
実装コード:

//strcpy模拟实现
char* mn_strcpy(char* p1, const char* p2) {
    
    
	//我们不希望改变字符串p2 所以用const修饰,p1为目标空间的首地址,p2为源字符串首地址
	assert(p1);//防止为NULL
	assert(p2);
	char* p = p1;//保存目标空间首地址
	while (*p1=*p2) {
    
    //解引用将*p2的字符赋给*p1
		p1++;//地址加加
		p2++;
	}
	return p;//返回目标空间首地址
 }
int main() {
    
    
	char a[20] = {
    
     0 };
	char b[] = "abcdef";
char*p=mn_strcpy(a, b);
	printf("%s\n", p);
	return 0;
}

操作結果:

ここに画像の説明を挿入します

5. strncpy関数の使用

パラメータと戻り値の型:

`char * strncpy ( char * destination, const char * source, size_t num );

1. ソース文字列からターゲット スペースに num 文字をコピーします。
2. ソース文字列の長さが num 未満の場合は、ソース文字列をコピーした後、ターゲットの末尾に num になるまで 0 を追加します。

使用:

int main() {
    
    
	char a[20] = {
    
    0};
	char b[] = "abcde";
	printf("%s\n", strncpy(a, b,3));//只拷贝三个
	return 0;
}

操作結果:
ここに画像の説明を挿入します

6. strcatの使い方とシミュレーション実装

パラメータと戻り値の型:

char* strcat(char * destination, const char * source );

機能: ソース文字列をターゲット文字列に接続します
1. ソース文字列は「\0」で終わる必要があります。
2. ターゲット文字列には \0 も存在する必要があります。そうでない場合は、どこから追加を開始するかを知る方法がありません。
3. ターゲット領域は、ソース文字列の内容を収容するのに十分な大きさである必要があります。
4. ターゲット スペースは変更可能である必要があります。

使用:

#include<string.h>//包含头文件
int main() {
    
    
	char a[20] = "qwe";//目标空间一定要够大
	char b[] = "abcdef";
	char* p = strcat(a, b);//用p来接收返回来的地址
	printf("%s\n", p);//打印
	return 0;
}

実行結果:
ここに画像の説明を挿入します
strcat 関数をシミュレートします

1. パラメータがターゲット空間のアドレスとソース文字列アドレスであり、戻り値がターゲット空間の最初のアドレスである関数を作成します。
2. まず、ポインタ変数を作成します。ターゲット空間の最初のアドレスを保存し、ループを使用して \0' が見つかるまでターゲット空間内の文字列を走査し、停止します。
3. すべての文字を転送します。ソース文字列をターゲット空間に転送します。「\0」が転送されるまで、ターゲット空間の最初のアドレスが返されます

実装コード:

//strcat模拟
char* nm_strcat(char* p1, const char* p2) {
    
    
	//我们不希望改变字符串p2 所以用const修饰,p1为目标空间的首地址,p2为源字符串首地址
	char* p = p1;//保存目标空间首地址
	assert(p1);
	assert(p2);
		while (*p1)//遍历*p直到找到‘/0’
			p1++;
		while (*p1=*p2) {
    
    ///解引用将*p2的字符赋给*p1
		p1++;
		p2++;
	}
	return p;//返回目标空间首地址
}
int main() {
    
    
	char a[20] ="grr";
	char b[] = "abcdef";
	char*p=nm_strcat(a, b);
	printf("%s\n", p);
	return 0;
}

操作結果:
ここに画像の説明を挿入します

7. strncat関数の使用

パラメータと戻り値の型:

char * strncat ( char * destination, const char * source, size_t num );

1. source が指す文字列の最初の num 文字を destination が指す文字列の末尾に追加し、その後 \0 文字を追加します
2. source が指す長さが num 未満の場合、文字列の \0 までの内容のみが destination が指す文字列の末尾に追加されます

使用:

int main() {
    
    
	char a[20] = "xxx";
	char b[] = "abcde";
	printf("%s\n", strncat(a, b,3));

	return 0;
}

操作結果:
ここに画像の説明を挿入します

8. strcmpの使い方とシミュレーション実装

パラメータと戻り値の型:

int  strcmp(comst char * destination, const char * source );

最初の文字列が 2 番目の文字列より大きい場合は、0 より大きい数値が返されます。
最初の文字列が 2 番目の文字列と等しい場合は、0
最初の文字列が 2 番目の文字列より小さい場合、0 より小さい数値が返されます。
では、2 つの文字列をどのように判断するのでしょうか? 2 つの文字列内の対応する位置にある文字の ASCII コード値を比較します。

使用:

#include<string.h>//包含头文件
int main() {
    
    
	char a[] = "abfa";//
	char b[] = "abqc";
	int t = strcmp(a, b);
		if (t == 0)
		printf("a=b");
	else if (t > 0)
		printf("a>b");
	else
		printf("a<b");
	return 0;
}

比較プロセス チャート:
ここに画像の説明を挿入します
実行結果:
ここに画像の説明を挿入します
strcmp 関数のシミュレーション

1. パラメータが 2 つの文字列の最初のアドレスをそれぞれ受け取り、int データを返す関数を作成します。
2. ループを通じて 2 つの文字列を 1 つずつ比較し、それらが等しくない、または両方が '\0' である状況

コード:

int mn_strcmp(const char* p1, const char* p2) {
    
    
	//	我们不希望改变字符串p2 和p1所以用const修饰,p1为目标空间的首地址,p2为源字符串的首地址
	assert(p1);//防止为NULL
	assert(p2);
	while (*p1 == *p2) {
    
    //相等就继续比较
		if (*p1 == '\0')//当双方都是\0时就是两字符串相等
			return 0;
		p1++;
		p2++;
	}
	return *p1 - *p2;//p1>pp2时返回正值,否则反之
}
int main() {
    
    
	char* a = "ger";
	char* b = "ger";
	int t = mn_strcmp(a, b);
	if (t == 0)
		printf("a=b");
	else if (t > 0)
		printf("a>b");
	else
		printf("a<b");
	return 0;
}

操作結果:
ここに画像の説明を挿入します

9. strncmp関数の使用

パラメータと戻り値の型:

 int strncmp ( const char * str1, const char * str2, size_t num );

str1 と str2 の最初の num 文字を比較します。等しい場合は、num 文字まで比較を続けます。事前に違いが見つかった場合
、早期に終了するだけです。大きい文字は、他の文字よりも大きい文字列内にあります。 num 文字が等しい場合、等しいことを意味し、0 を返します

使用:

int main() {
    
    
	char* a = "gerqq";
	char* b = "gera";
	int t = strncmp(a, b,3);//比较前三个字符
	if (t == 0)
		printf("a=b");
	else if (t > 0)
		printf("a>b");
	else
		printf("a<b");
	return 0;
}

操作結果:
ここに画像の説明を挿入します

10. strstrの使い方とシミュレーション実装

パラメータと戻り値の型:

char * strstr ( const char * str1, const char * str2);

関数: str1 で str2 を検索
1. この関数は、文字列 str1 内で文字列 str2 が最初に出現する位置を返します。
2. 文字文字列比較の一致には \0 文字が含まれておらず、\0 は終了マークとして使用されます

使用:

#include<string.h>//包含头文件
int main() {
    
    
	char a[] = "abcdfa";//
	char b[] = "cd";//
	char* p = strstr(a, b);//在a字符串中找b字符串,找到之后返回找到时在a的地址
	printf("%s\n", p);
	return 0;
}

実行結果:
ここに画像の説明を挿入します
strsstr 関数をシミュレートします

1. 関数を作成し、パラメータは 2 つの文字列の最初のアドレスをそれぞれ受け取り、検索が成功した場合にそのアドレスを返します。
2. 最初のケースは、検索された文字列は NULL です このとき、ターゲット文字列を直接返します 次に、3 つのポインタを設定する必要があります。1 つはターゲット文字列の移動先の位置を記録し、他の 2 つは別々にトラバースされます。 , 続行します 異なっていれば飛び出します 飛び出した後は記録されます ポインタは ++ で、ソース文字列の '\0' が見つかるまで次の走査が実行されますこれは検索が成功したことを意味します。そうでない場合は見つかりません

コード:

char* mn_strstr(const  char* p1, const char* p2) {
    
    
	assert(p1);//	我们不希望改变字符串p2 和p1所以用const修饰,p1为目标空间的首地址,p2为源字符串的首地址
	if (!*p2)//源字符串为NILL时直接返回p1
		return p1;
	char* con = p1;//记录指针,从第一个位置开始
	char* s1 = NULL;//空
	char* s2 = NULL;//
	while (*con) {
    
    //当将目标字符串都找一次还没有就返回NULL
		s1 = con;//目标字符移动指针
		s2 = p2;//源字符移动指针
		while ((*s1 == *s2) && *s2) {
    
    //对比,当s2为'\0'时结束
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return con;
		con++;
	}
	return NULL;
}

int main() {
    
    
	char* a = "cdf";
	char* b = "cqf";
	char* p = mn_strstr(a, b);
	if (!p)
		printf("找不到\n");
	else
		printf("%s\n", p);
	return 0;
}

操作結果:
ここに画像の説明を挿入します

11. strtok関数の使用

パラメータと戻り値の型:

char * strtok ( char * str, const char * sep);

1. sep パラメータは、区切り文字として使用される文字セットを定義する文字列を指します。
2. 最初のパラメータは、0 または 1 つで区切られた複数のトークンを含む文字列を指定します。 sep 文字列内の複数の区切り文字。
3. strtok 関数は str 内の次のタグを見つけ、\0 で終了し、このタグへのポインタを返します。 (注: strtok 関数は操作対象の文字列を変更するため、strtok 関数を使用して分割された文字列は通常は一時的なコピーであり、変更できます。)
4.strtok 関数の最初のパラメータの場合が NULL でない場合、関数は str 内の最初のトークンを検索し、strtok 関数は文字列内のその位置を保存します。
5. strtok 関数の最初のパラメータは NULL で、この関数は同じ文字列内の保存された位置から開始して次のマークを検索します。
6. 文字列内にトークンがなくなった場合は、NULL ポインタを返します。

使用:

#include <stdio.h>
#include <string.h>
int main()
{
    
    
	char arr[] = "192.168.6.111";
	char* sep = ".";//作为分割符
	char* str = NULL;//等会作接收返回值
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
    
    
		printf("%s\n", str);
	}
	return 0;
}

操作結果:
ここに画像の説明を挿入します

12. strerror 関数の使用

パラメータと戻り値の型:

char * strerror ( int errnum );

strerror 関数は、パラメーター部分のエラー コードに対応するエラー メッセージの文字列アドレスを返すことができます。一部のエラー コードは、さまざまなシステムや C 言語標準ライブラリの実装で指定されます。それらは通常、ヘッダ ファイル errno.h に記述されます。C 言語プログラムは、起動時にエラー コードを使用します。包括的な変数 errno は、現在のエラー コードを記録します。ただし、プログラムを開始すると、errno は 0 になり、エラーがないことを示します。標準ライブラリの関数を使用してエラーが発生すると、「対応するエラー コードが errno に格納されており、その番号が表示されます」と表示されます。エラー コードの は整数であり、その意味を理解するのが難しいため、各エラー コードには対応するエラー メッセージがあります。 strerror 関数は、エラーに対応するエラー メッセージ文字列のアドレスを返すことができます。

使用:

#include <errno.h>
#include <string.h>
#include <stdio.h>
//我们打印⼀下0~10这些错误码对应的信息
int main()
{
    
    
	int i = 0;
	for (i = 0; i <= 10; i++) {
    
    
		printf("%s\n", strerror(i));
	}
	return 0;
}

操作結果:
ここに画像の説明を挿入します

上記は私が共有した内容です。間違いがある場合は、コメント欄にメッセージを残してください。
最後に、ご視聴いただきありがとうございました。

おすすめ

転載: blog.csdn.net/2302_79539362/article/details/134618691