C语言函数序列之字符串函数模拟:strlen、strcpy、strcmp、strcat、strstr

1 .strlen函数

1.1函数介绍

C语言函数序列之字符串函数模拟:strlen、strcpy、strcmp、strcat、strstr_第1张图片

strlen函数,头文件。函数用于求字符串长度并返回该值。 所求字符串长度应为不可改变的固定值。

1.2函数演示

#include 
#include 

int main ()
{
  char szInput[256];
  printf ("Enter a sentence: ");
  gets (szInput);
  printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
  return 0;
}

Output:

Enter sentence: just testing The sentence entered is 12 characters
long

1.3函数模拟

此函数为常用函数且较为简单,故小编在此提供三种模拟方法:

//方法一 计数方式
size_t my_strlen(const char * str)
{
 int count = 0;
 while(*str)
 {
  count++;
  str++;
 }
 return count;
}

//方法二 不能创建临时变量,采用递归
size_t my_strlen(const char * str)
{
 if(*str == '\0')
  return 0;
 else
  return 1+my_strlen(str+1);
}

//方法三 指针——指针的方式
size_t my_strlen(const char *s)
{
   char *p = s;
   while(*p != ‘\0)
       p++;
   return p-s;
}

应注意函数参数和返回值保持与原函数一致。

2.strcpy函数

2.1函数介绍

C语言函数序列之字符串函数模拟:strlen、strcpy、strcmp、strcat、strstr_第2张图片

strcpy函数,头文件。函数用于将源字符串的内容复制到目标空间中。
源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。

2.2函数演示

#include 
#include 

int main ()
{
  char str1[]="Sample string";
  char str2[40];
  char str3[40];
  strcpy (str2,str1);//将str1的内容复制到str2内
  strcpy (str3,"copy successful");//将字符串 copy successful 复制到str3内。
  printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
  return 0;
}

Output:
str1: Sample string
str2: Sample string
str3: copy successful

2.3函数模拟

要注意以下几点:

1.参数顺序
2.函数的功能,停止条件 ‘\0’
3.assert判断指针是否为空
4.const修饰指针
5.函数返回值

#include
#include
char* my_strcpy(char* n1,char*n2)
{
	char* ret = n1;
	assert((n1 && n2) != NULL);//防止指针为空
	while ((*n1++ = *n2++))//运算顺序 '*' > '++' > '='
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "";
	char arr2[] = "I love 阿迪";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
}

Output:
I love 阿迪

3.strcmp函数

3.1函数介绍

C语言函数序列之字符串函数模拟:strlen、strcpy、strcmp、strcat、strstr_第3张图片

strcmp函数,头文件,用于比较字符串/字符大小。(依次比较字符串中的字符大小,遇见不同的字符则直接结束比较并返回返回值。)
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

3.2函数演示

#include 
#include 
//猜测最喜欢的水果,直到输入apple才跳出循环并结束函数
int main ()
{
  char key[] = "apple";
  char buffer[80];
  do {
     printf ("Guess my favorite fruit? ");
     fflush (stdout);
     scanf ("%79s",buffer);
  } while (strcmp (key,buffer) != 0);
  puts ("Correct answer!");
  return 0;
}

Output:

Guess my favourite fruit? orange
Guess my favourite fruit? banana
Guess my favourite fruit? apple
Correct answer!

3.3函数模拟

#include
#include
int my_strcmp(const char* src, const char* dst)
{
	int ret = 0;
	assert((src&&dst) != NULL);
	while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
	{
		++src, ++dst;
	}
	if (ret < 0)
		ret = -1;
	else if (ret > 0)
		ret = 1;
	return(ret);
}
int main()
{
	char arr1[] = "aschifsuf";
	char arr2[] = "skdvgufsdgH";
	int ret=my_strcmp(arr1, arr2);
	printf("%d", ret);
}

Output:
–1

4.strcat函数

4.1函数介绍

在这里插入图片描述

strcat函数,头文件,用于追加字符串。
将源字符串的副本追加到目标字符串。目标中的终止空字符被源字符串的第一个字符覆盖,并且在目标中由两者串联形成的新字符串的末尾包含一个空字符。
注意:
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。

4.2函数演示

#include 
#include 

int main ()
{
  char str[80];
  strcpy (str,"these ");
  strcat (str,"strings ");
  strcat (str,"are ");
  strcat (str,"concatenated.");
  puts (str);
  return 0;
}

Output:
these strings are concatenated.

4.3函数模拟

#include
#include
char* my_strcat(char* des, const char* src)
{
	char* ret = des;
	assert((des && src) != NULL);
	//找到目标空间中的 ‘\0’
	while (*des)
	{
		des++;
	}
	while ((*des++ = *src++))
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "hey ";
	char arr2[] = "我爱阿迪";
	my_strcat(arr1, arr2);
	printf("%s", arr1);
}

Output:
hey 我爱阿迪

5.strstr函数

5.1函数介绍

C语言函数序列之字符串函数模拟:strlen、strcpy、strcmp、strcat、strstr_第4张图片
C语言

strstr函数,头文件。用于在字符串str1中查找str2的存在,若不存在则返回一个空指针NULL。

5.2函数演示

#include 
#include 
//在str数组中查找‘simple’字符串的存在,若存在则将其更改为‘sample’
int main ()
{
  char str[] ="This is a simple string";
  char * pch;
  pch = strstr (str,"simple");
  if (pch != NULL)
    strncpy (pch,"sample",6);
  puts (str);
  return 0;
}

Output:
This is a sample string

5.3函数模拟

#include
#include
char* my_strstr(const char* dest, const char* src)
{
	assert((dest && src) != NULL);
	char* be = (char*)dest;//存一份目标空间的起始地址
	char* s1, * s2;
	if (!*src)//如果src指向的内容为空,则直接返回(char*)dest。
		return (char*)dest;
	while (*be)/*当 *be的内容为空时(循环已经进行到str1的‘\0’处,仍未跳出循环),
	则跳出循环返回NULL*/
	{
		s1 = be;
		s2 = (char*)src;
		while (*s1 && *s2 && !(*s1 - *s2)/*判断两个指针指向的内容是否相等*/)
		{  //不相等且都不为空则进入循环进行++运算,比较下一地址上的内容
			s1++;
			s2++;
		}
		if (!*s2)/*如果上一循环循环结束后s2指向的内容为空(即在该be地址下
		进行查找时s2可以查找完毕,即上一循环完整完成。)*/
			return be;
		be++;/*若在当下be地址开始查找时未能完成则对be进行++,进行以下一地址
		为起始地址的查找*/
	}
	return NULL;
}
int main()
{
	char arr1[] = "i love Iron man";
	char arr2[] = "ron";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
		printf("找不到");
	else
		printf("找到了");
}

(注:感兴趣的小伙伴可以研究一下kmp算法。)

你可能感兴趣的:(世界成长记录,c语言,c++)