C语言程序设计——字符串典型题练习

1、计算一个字符串中最大的重复子串的字符的数量

/*******************************************************************
*
*	name	 :	CalSubStrMaxCnt
*	function :  计算一个字符串中最大的重复子串的字符的数量
*	argument :  
*				@str:需要查找的字符串的地址
*				
*	retval	 :  函数调用成功则返回最大子串的字符数量
*	author	 :  User_laubon@163.com
*	date	 :  2024/05/01
* 	note	 :  None
* 	
* *****************************************************************/

int CalSubStrMaxCnt(const char *str)
{
	if(NULL == str)
	{
		printf("argument is invaild\n");
		return -1;
	}

	int cnt = 1; //计数器用于记录相同字符的数量,都不连续则返回值为1
	int max = 0;

	//循环判断字符,当遇到'\0'则表达到达字符串末尾,此时可以终止循环
	while(*str != '\0')
	{
		
		//判断当前的字符和下一个字符的ASCII是否相同
		if(*str == *(str+1))
		{
			cnt++; 
		}
		else
		{
			max = (max < cnt) ?  cnt : max;
			cnt = 1;
		}

		str++;
	}

	//当终止循环时,则把最大值返回
	return max;
}

2、实现字符串的拷贝(不调用库函数的情况下)

/*******************************************************************
*
*	name	 :	MyStrcpy
*	function :  实现字符串的拷贝(不调用库函数的情况下)
*	argument :  
*				@str_src :需要拷贝字符串的地址
*				@str_dest:待拷贝的目标空间的地址
*				
*	retval	 :  函数调用成功则返回目标空间的地址
*	author	 :  User_laubon@163.com
*	date	 :  2024/05/01
* 	note	 :  None
* 	
* *****************************************************************/


char * MyStrcpy(const char *str_src,char *str_dest)
{
	//循环的把str_src字符串的每个字符进行赋值,赋值到str_dest地址下
	while(*str_src != '\0')
	{
		//如果没有到达字符串末尾,则把字符串的字符按照顺序依次赋值
		*str_dest = *str_src++;
		 
		str_dest++;
	}

	//包含了'\0'
	*str_dest = '\0';

	return str_dest;
}

3、实现字符串的比较(不调用库函数的情况下)

/*******************************************************************
*
*	name	 :	MyStrcmp
*	function :  实现字符串的比较(不调用库函数的情况下)
*	argument :  
*				@str1 :需要比较的第一个字符串的地址
*				@str2 :需要比较的第二个字符串的地址
*				
*	retval	 :  两个字符串相同则返回0,如果不相同则返回1
*	author	 :  User_laubon@163.com
*	date	 :  2024/05/01
* 	note	 :  None
* 	
* *****************************************************************/


int MyStrcmp(const char *str1,const char *str2)
{

	//循环的比较两个字符串的字符ASCII码是否相等
	while( *str1++ == *str2++ )
	{
		if (*str1 == '\0' && *str2 == '\0')
		{
			return 1;
		}	
	}
	
	return 0;
}

4、实现把一个char组成的字符串循环右移n个

/*******************************************************************
*
*	name	 :	StrRightShift
*	function :  实现把一个char组成的字符串循环右移n个。
*	argument :  
*				@str  :需要右移的字符串的地址
*				@n    :需要右移的位数
*				
*	retval	 :  调用成功返回移位的字符串的首地址
*	author	 :  User_laubon@163.com
*	date	 :  2024/05/01
* 	note	 :  原来是"abcdefghi" 如果n=2,移位后应该是"hiabcdefg"
* 	
* *****************************************************************/


char * StrRightShift(const char *str,int n)
{
	//计算字符的实际长度
	int cnt = strlen(str);

	//printf("string cnt = %d\n",cnt);
	
	//给字符串的字符申请内存
	char *p = (char *)malloc(cnt);

	//把输入的字符串中的字符备份到堆内存
	strcpy(p,str);

	char temp = 0; //存储要移位的字符

	//循环进行字符的移位        									
 	for (int i = 0; i < n; ++i)
	{
		temp = *(p + cnt - 1);
		printf("temp = %c\n",temp);

		for (int j = cnt - 2; j >= 0; j--)
		{
			*(p+j+1)= *(p+j);
		}

		*p = temp;
	}

	//输出移位后的字符串
	printf("string is %s\n",str);
	printf("string is %s\n",p);

	return p;
}

5、实现将一个输入的字符串进行逆序

/********************************************************************
*
*	name	 :	StrReverse
*	function :  实现将一个输入的字符串进行逆序           
*	argument :  
*				@str  :需要逆序的字符串的地址
*				
*	retval	 :  调用成功返回逆序之后的字符串的首地址
*	author	 :  User_laubon@163.com
*	date	 :  2024/05/01
* 	note	 :  原来是"helloworld" 逆序后应该是"dlrowolleh"
* 	
* *****************************************************************/


char *StrReverse(const char *str)
{
	
	char *p = (char *)malloc(128);

	int cnt = strlen(str);

	for (int i = 0; i < cnt; ++i)
	{
		*(p+i) = *((str+cnt-1)-i);
	}

	return p;
}

6、实现将一个输入的字符串进行逆序输出

/********************************************************************
*
*	name	 :	StrReverse
*	function :  实现将一个输入的字符串进行逆序输出         
*	argument :  
*				@str  :需要逆序输出的字符串的地址
*				
*	retval	 :  None
*	author	 :  User_laubon@163.com
*	date	 :  2024/05/01
* 	note	 :  原来是"helloworld" 逆序后应该是"dlrowolleh"
* 	
* ******************************************************************/



void StrReversePrint(char *ptr)
{
	//写好终止条件,防止死循环出现,导致函数频繁调用出现栈溢出现象
	if ('\0' == *ptr)
	{
		return; 
	}

	StrReversePrint(ptr+1);

	printf("%c",*ptr);

}

7、递归思想实现一个输入的字符串的实际长度

/********************************************************************
*
*	name	 :	StrReverse
*	function :  递归思想实现一个输入的字符串的实际长度     
*	argument :  
*				@str  :需要逆序输出的字符串的地址
*				
*	retval	 :  返回计算的字符数量,不包括'\0'
*	author	 :  User_laubon@163.com
*	date	 :  2024/05/01
* 	note	 :  None
* 	
* ******************************************************************/


int MyStrlen(const char *ptr)
{
	//写好终止条件,遇到'\0'结束递归,'\0'不计算在内
	if ('\0' == *ptr)
	{
		return 0;
	}
	else
	{
		return MyStrlen(ptr+1)+1;
	}

}
posted @ 2024-05-01 16:41  banon  阅读(125)  评论(0编辑  收藏  举报