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

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

时间:2024-05-01 16:56:48浏览次数:20  
标签:字符 cnt int C语言 char str 字符串 程序设计

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

/*******************************************************************
*
*	name	 :	CalSubStrMaxCnt
*	function :  计算一个字符串中最大的重复子串的字符的数量
*	argument :  
*				@str:需要查找的字符串的地址
*				
*	retval	 :  函数调用成功则返回最大子串的字符数量
*	author	 :  [email protected]
*	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	 :  [email protected]
*	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	 :  [email protected]
*	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	 :  [email protected]
*	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	 :  [email protected]
*	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	 :  [email protected]
*	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	 :  [email protected]
*	date	 :  2024/05/01
* 	note	 :  None
* 	
* ******************************************************************/


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

}

标签:字符,cnt,int,C语言,char,str,字符串,程序设计
From: https://www.cnblogs.com/banon/p/18169454

相关文章

  • C语言实现文件加密
    原理加密文本,或加密二进制文件,可以选择的一个最小加密单元是单个字符(或者说,一个byte)。将每个byte和31做异或运算,得到加密结果。再做一次异或则得以恢复原始数据。加密文本-控制台程序#include<stdio.h>#include<stdlib.h>voidencrypt(char*message){charc;......
  • 39.C语言数组学习的有关整理
    首先还是关于这两个东西sizeof()用于计算所占空间大小strlen()只用于求字符串长度/***sizeof计算所占空间大小\0也会计算*strlen只能用来求字符串长度直到找到字符串结束标志\0**/chararr1[]={'a','b','c'};//abcchararr2[]="abc";//abc\0......
  • 使用g开头的数组字符串的解析
    在做ofd的文件解析的时候,会遇到带有这种描述的数组"g22.03g31.20.2"。这个字符串通过空格进行分割得到一个["g",2,2.0,3,"g",3,1.2,0.2]这样的数组数据。这个是以g表示一个数组的开头,包含了2个元素,每个元素都是2.0的数组。整个字符串翻译成一个完整的数组就是这样......
  • Java中“==”与“equals”在字符串比较中的应用与分析
    packagecom.aiit.helloworld;publicclassHelloWorld{ publicstaticvoidmain(Stringargs[]){ Strings1="a"+"b"; Strings2=newString(s1); if(s1==s2)//false System.out.println("doit~~~"); if(s1.equals(s......
  • 关于JSON转字符串后前端与python得到的结果不一致的问题,及对象按key排序
    背景:哈希码参数校验防参数篡改。前端下发接口时对参数按约定秘钥和逻辑进行加密,后端在获取到请求后对请求参数以同样的秘钥和逻辑加密计算得出哈希值,再与请求的哈希值对比,如果不一致则证明参数被篡改。前端代码:对json对象进行了按key排序1letdataTmp=this.de......
  • Go语言系列——数组和切片、可变参数函数、Maps、字符串、指针、结构体、方法、接口(一
    文章目录11-数组和切片数组数组的声明数组是值类型数组的长度使用range迭代数组多维数组切片创建一个切片切片的修改切片的长度和容量使用make创建一个切片追加切片元素切片的函数传递多维切片内存优化12-可变参数函数什么是可变参数函数语法通过一些例子理解可变参......
  • 【C语言】---- for循环函数
    在C语言中,for循环是一种常用的循环结构,用于重复执行一段代码多次。for循环提供了一种简洁而灵活的方式来实现循环,使程序员能够更有效地编写和管理代码。for循环的语法for循环的基本语法如下:for(初始化表达式;循环条件;更新表达式){//循环体}其中:初始化表达......
  • C语言-布尔类型
    一.布尔类型——适用于判别真假的类型说明:布尔类型是一种形式(int)的别名:int——>boolTrue——>1(其他非0都是1)False——>0对应:0为假,非零为真1.第一种方式 ——使用C89标准,使用宏定义(#define)格式:#defineBOOLint______________________________......
  • C语言中四舍五入问题总结
    C语言中四舍五入问题的总结在C语言中大部分情况下都是不需要四舍五入的。除了一种情况:在使用输出函数printf()限制浮点型输出的小数位个数eg:printf("%0.2f",1.567);//输出的结果是1.57其他情况下都不需要四舍五入,比如强制转换在不同类型的混合运算中,编译器也会自动地转......
  • 在密码学中,“加盐”(Salting)是指在存储用户密码的哈希值之前,向原始密码添加一个随机生
    在密码学中,“加盐”(Salting)是指在存储用户密码的哈希值之前,向原始密码添加一个随机生成的字符串(称为“盐”Salt)的过程。这个盐值通常是全球唯一的,并且与每个用户账户相关联,存储在数据库中与哈希值一起。加盐的目的主要有两个:抵御彩虹表攻击:彩虹表是一种预先计算好的哈希值对照表......