c言語での重要なライブラリ関数の解釈とシミュレーションの実装-一般的に使用される文字列ライブラリ関数

一般的に使用される文字列ライブラリ関数の概要

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

関数の使用法と実現

char * strcat(char * s1、char * s2)の目的と実現

#include<stdio.h>
#include<string.h>

int main()
{
    
    
	char arr1[20] ="abcd";
	char arr2[20] ="efdg";
	char* pr = NULL;
	pr = strcat(arr1, arr2); // 返回一个char*指针
	printf( "%s\n",pr);
	puts(pr);
	return 0;
}

注意:

  1. arr1はサイズを指定する必要があります。指定しないと、スペースが不正に使用されます。
  2. 両方の印刷方法が利用可能です

シミュレーションの実装

#include<stdio.h>
#include<string.h>

char* My_strcat(char* p, char* r)
{
    
    
	int i = 0;
	while (*p != '\0')
	{
    
    
		p++;
		i++;
	}
	int j = 0;
	char tmp = 0;
	while (*r != '\0')
	{
    
    
		*p = *r;
		p++;
		r++;
		i++;    // 计数器i 得知指针p移动的距离 在退回去
	}

	return p-i;
}


int main()
{
    
    
	char arr1[20] = "ab cd";  // arr 容量不可少
	char arr2[20] = "ef0ko";
	
	char* pr=My_strcat(arr1,arr2);
	printf(pr);
	return 0;
}

char * strchr(char * s1、int ch)の目的と実現

注:返されるのは、chの後の文字列のアドレスです。


#include<stdio.h>
#include<string.h>


int main()
{
    
    
	char arr[20] = "abcdef";
	int ch = 'b';
	char* pr = strchr(arr, ch);
	printf("%p\n", *pr);
	printf(pr);
	return 0;
}

ここに画像の説明を挿入します
返されるのは、
シミュレーションの実装後のアドレスです。

char* My_strchr(char* p, int k)
{
    
    
	while (*p != '\0')
	{
    
    
		if (*p == k)
		{
    
    
			return p;
		}
		p++;
	}
	return NULL;
}

int main()
{
    
    
	char arr[20] = "abcdef";
	int ch = 'd';
	char * pr = My_strchr(arr, ch);
	printf(pr);
	return 0;
}

char * strcmp(char * s1、char * s2)の目的と実現

#include<stdio.h>
#include<string.h>

int main()
{
    
    
	char arr[20] = "adc";
	char arr2[20] = {
    
     0 };

	scanf("%s", arr2);
	if (!(strcmp(arr, arr2)))
	{
    
    
		printf("oppen");
	}
	else
	{
    
    
		printf("no");
	}
	return 0;
}
实现密码开锁 以及字符串比较

シミュレーション
方法1

int My_strcmp(char* p, char* r)
{
    
    
	int i = 0;
	int j = 0;
	int b = 0;
	assert((*p != NULL) && (*r != NULL));
	while (*(p + i) == '\0')
	{
    
    
		i++;
	}
	while (*(p + i) == '\0')
	{
    
    
		j++;
	}
	if (i != j)
	{
    
    
		return i - j; // 不相等返回差值
	}
	else
	{
    
    
		for (int a = 0; a < i; a++)
		{
    
    
				if (*(p + a) != *(r + a))
				{
    
    
					return 0; // 不相等返回0
				}
			
		}
		return 1; // 相等返回1
	}
}

int main()
{
    
    
	char arr[20] = "abc";
	char arr2[20] = "abcd";
	if ((My_strcmp(arr, arr2))==1)
	{
    
    
		printf("oppen");
	}
	else
	{
    
    
		printf("no");
	}
	return 0;
}

方法2

#include<stdio.h>
#include<string.h>
#include<assert.h>

int My_strcmp(const char* p, const char* r)
{
    
    
	assert ((*p != NULL) && (*r != NULL));
	while (*p == *r)
	{
    
    
		if (*p == '\0')
		{
    
    
			return 0;
		}
		p++;
		r++;
	}
	return *p - *r;
}
int main()
{
    
    
	char arr[20] = "abc";
	char arr2[20] = "abcd";
	if ((My_strcmp(arr, arr2))==0)
	{
    
    
		printf("oppen");
	}
	else
	{
    
    
		printf("no");
	}
	return 0;
}

char * strcpy(char * s1、char * s2)の目的と実現

文字列をコピーする

#include<stdio.h>
#include<string.h>
#include<assert.h>

int main()
{
    
    
	char arr1[20] = "abcd";
	char arr2[20] = {
    
     0 };
	 char*p=strcpy(arr2, arr1);
	//My_strcpy(arr2, arr1);
	printf(arr2);
	printf("\n");
	printf(p);
	return 0;
}

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

注意

  1. 背面を前面にコピーします。
  2. メモリの割り当てに注意してください。そうしないと、不正なメモリアクセスと見なされます。
  3. 返されるのは、コピーされた文字列の最初のアドレスです。

シミュレーションの実装

#include<stdio.h>
#include<string.h>
#include<assert.h>

char* My_strcpy(char* r, char* p)
{
    
    
	int c = 0;
	while (*p != '\0')
	{
    
    
		*r = *p;
			p++;
		r++;
		c++;
	}
	return r - c;
}

int main()
{
    
    
	char arr1[20] = "abcd";
	char arr2[20] = {
    
     0 };
	 char*p=My_strcpy(arr2, arr1);
	//My_strcpy(arr2, arr1);
	printf(arr2);
	printf("\n");
	printf(p);
	return 0;
}

unsigned strlen(char * s)の目的と実現

まず、strlenとsizeofの違い私は特別なブログを書きました。ここにsizeofとstrlenを突いてください。

strlenをシミュレートする

方法1

#include<stdio.h>
#include<string.h>
#include<assert.h>

int My_strlen(char* p)
{
    
    
	int i = 0;
	while (*p != '\0')
	{
    
    
		p++;
		i++;
	}
 	return i;
}

int main()
{
    
    
	char arr[] = "abcd";
	int len = My_strlen(arr);
	printf("%d", len);
	return 0;
}

方法2の再帰

#include<stdio.h>
#include<string.h>
#include<assert.h>


int My_strlen(char* p)
{
    
    
	if (*p == '\0')
	{
    
    
		return 0;   // 出口
	}
	return 1+My_strlen(p+1);
}





int main()
{
    
    
	char arr[] = "abcd";
	int len = My_strlen(arr);
	printf("%d", len);
	return 0;
}

char * strstr(char * s1、char * s2)の目的と実現


#include<stdio.h>
#include<string.h>
#include<assert.h>



int main()
{
    
    
	char arr1[20] = "abcdefg";
	char arr2[20] = "def";
	char* p = strstr(arr1, arr2);
	printf(p);
	return 0;
}

ここに画像の説明を挿入します
シミュレーションの実装

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* My_strstr(char* p, char* r)
{
    
    
	int i = 0;
	int k = 0;
	while (*p != '\0')
	{
    
    
		if (*p == *r)
		{
    
    
			r++;
			i++;
			p++;
			
		}
		else if (*r == '\0')
		{
    
    
			return p - k;
		}
		else 
		{
    
    
			p++;
			k++;
		}
	}
	if (*p == '\0')
	{
    
    
		return p - i;
	}
	return NULL;
}

int main()
{
    
    
	char arr1[20] = "abcdefg";
	char arr2[20] = "bcdefg";
	char* p = My_strstr(arr1, arr2);
	printf(p);

	if (p == NULL)
	{
    
    
		printf("heh");
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/qq_45849625/article/details/114781711