目录
  • 1.strlen
    • 1.计数法
    • 2.递归法
    • 3.指针减指针
  • 2.strcpy
    • 3.strcmp
      • 4.strcat
        • 5.strstr
          • 6.strtok
            • 7.字符分类函数
              • 8.memcpy&memmove
                • 9.memcmp 

                  经历了C语言基础篇的学习,让我们来简单了解几个C语言的库函数!

                  1.strlen

                  字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。

                   函数的模拟实现

                  1.计数法

                  int my_strlen(dest)
                  {
                  int count=0;
                      while(dest)//当dest等于'\0'时停止循环
                  {
                      count++;
                      dest++;
                  }
                  return count;
                  }

                  2.递归法

                  int my_strlen(char* dest)
                  {
                      int count=0;
                      if(*dest!='0')
                      {
                          dest++;
                          count++;
                          return my_strlen(dest,count)
                      }
                      else
                      return count;
                  }

                  3.指针减指针

                  int my_strlen(char* dest)
                  {
                      char* arr=dest;//定义一个新指针指向dest
                      while(*arr)//直到arr指向'\0'
                      {
                      arr++;
                      }
                      return (arr)-(dest);//指针相减代表两个指针之间的元素个数
                  }

                  2.strcpy

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

                  会将源字符串中的 '\0' 拷贝到目标空间。

                  目标空间必须足够大,并且可变以确保能存放源字符串。

                   函数的模拟实现

                  char* my_strcpy(char* dest, const char* str)
                  {
                  	char* arr1 = dest;
                  	while ((*dest++ = *str++)!='\0')
                  	{
                  		;
                  	}
                  	return arr1;
                  }
                  int main()
                  {
                  	char arr1[] = "***************";
                  	char arr2[] = "hello word";
                  	my_strcpy(arr1, arr2);
                  	printf("%s", arr1);
                  	return 0;
                  }

                  3.strcmp

                  int strcmp ( const char * str1, const char * str2 );

                  第一个字符串大于第二个字符串,则返回大于0的数字

                  第一个字符串等于第二个字符串,则返回0

                  第一个字符串小于第二个字符串,则返回小于0的数字

                  函数的模拟实现

                  int my_strcmp(char* arr1,char* arr2)
                  {
                  	while(*arr1 == *arr2)
                  	{
                  		if (*arr1 == '\0' && *arr2 == '\0')
                  		{
                  			return 0;
                  		}
                  		else
                  		{
                  			arr1++; arr2++;
                   
                  		}
                  	}if (*arr1 > *arr2)
                  	{
                  		return 1;
                  	}
                  	else if (*arr1 < *arr2)
                  	{
                   
                  		return -1;
                  	}
                  }

                  4.strcat

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

                  函数的模拟实现

                  char* my_strcat(char* dest, char* str)
                  {
                  	char* ret = dest;
                  	while (*dest)
                  	{
                  		dest++;
                  	}
                  	while (*dest++=*str++)
                  	{
                  		;
                  	}
                  	return ret;
                  }
                  int main()
                  {
                  	char arr1[50] = "hello";
                  	char arr2[] = "word";
                  	char* count=my_strcat(arr1, arr2);
                  	printf("%s", count);
                  	return 0;
                  }

                  5.strstr

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

                  函数的模拟实现

                  char* my_strstr(char* dest, char* str)
                  {
                  	char* arr1 = str;
                  	char* cur = dest;
                  	while (*cur)
                  	{
                  		str = arr1;
                  		dest = cur;
                  		if (*dest != *str)
                  		{
                  			dest++;
                  			str++;
                  		}
                  		else if (*dest == *str)
                  		{
                  			while (*dest == *str)
                  			{
                  				dest++; str++;
                   
                  			}if (*str == '\0')
                  			{
                  				return cur;
                  			}
                  		}
                  		cur++;
                  	}return NULL;
                  }
                  int main()
                  {
                  	char arr1[] = "abbbcdef";
                  	char arr2[] = "bbc";
                  	char* ret=my_strstr(arr1, arr2);
                  	if (NULL == ret)
                  	{
                  		printf("找不到子串\n");
                  	}
                  	else
                  	{
                  		printf("%s\n", ret);
                  	}
                  	return 0;
                  }

                  6.strtok

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

                  strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

                  strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记

                  int main()
                  {
                  	char buff[] = "www.aaabbbccc@qq.com";
                  	char buf[20] = { 0 };
                  	strcpy(buf, buff);
                  	char* sep=".@";
                  	char* str = NULL;
                  	for (str = strtok(buf, sep); str != NULL; str = strtok(NULL, sep))
                  			{//NULL是从保存好的位置开始往后找
                  				printf("%s\n", str);
                  			}
                  	return 0;
                  }

                  7.字符分类函数

                  iscntrl  任何控制字符
                  isspace 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'
                  isdigit 十进制数字 0~9
                  isxdigit 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
                  islower 小写字母a~z
                  isupper 大写字母A~Z
                  isalpha 字母a~zA~Z
                  isalnum 字母或者数字,a~z,A~Z,0~9
                  ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
                  isgraph 任何图形字符
                  isprint 任何可打印字符,包括图形字符和空白字符

                  8.memcpy&memmove

                  void * memcpy ( void * destination , const void * source , size_t num )

                  函数模拟实现 

                  void* my_memmove(void* dest,void* str , size_t count)
                  {
                  	void* ch = dest;
                  	if (dest > str)
                  	{
                  		while (count--)
                  		{
                  			*((char*)dest + count) = *((char*)str + count);
                  		}
                  	}
                  	else
                  	{
                  		while (count--)
                  		{
                  			*(char*)dest = *(char*)str;
                  			dest=(char*)dest+1;
                  			str=(char*)str+1;
                  		}
                  	}
                  }
                  int main()
                  {
                  	int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
                  	my_memmove(arr1+2, arr1 , 20);
                  	int sz = sizeof(arr1) / sizeof(arr1[0]);
                  	for (int i = 0; i < sz; i++)
                  	{
                  		printf("%d", arr1[i]);
                  	}
                  	return 0;
                  }

                  9.memcmp 

                  int memcmp ( const void * ptr1 , const void * ptr2 , size_t num );

                   函数模拟实现

                  void* my_memcmp(char* arr, char* arr1, int count)
                  {
                  	while (count--)
                  	{
                  		if (*(char*)arr > *(char*)arr1)
                  		{
                  			return 1;
                  		}
                  		else if ((*(char*)arr < *(char*)arr1))
                  		{
                  			return -1;
                  		}
                  		arr++; arr1++;
                  	}	return 0;
                  }
                  int main()
                  {
                  	int arr[] = { 1,2,3,4,5 };
                  	int arr1[] = { 1,2,3,4,4 };
                  	int ret=my_memcmp(arr, arr1, 20);
                  	printf("%d", ret);
                  	return 0;
                  }
                  声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。