字符串(字符数组)的各种操作功能

2023-09-21 20:31:20

利用C语言编程平台以及所学的编程知识,完成以下工作:

  1. 采用菜单形成,通过菜单项(1;2;3;......)等选择方式,分别实现以下对字符串(字符数组)的各种操作功能:
  1. 初始化字符串(字符数组)A[ ],B[ ],C[ ]等,并键盘录入,要求字符串(字符数组)以’\0’为结束标志;
  2. 调用自己编写的函数int length(Char A[ ]),计算一个字符串A的长度;
  3. 调用自己编写的函数void Catstr(Char A[ ],Char B[ ],Char C[ ]),把字符串A,B拼接后,赋值给C;
  4. 调用自己编写的函数void Insertstr (Char A[ ],Char B[ ],Char C[ ],int k),在字符串A中第k个位置后面,插入字符串B,把插入完成后的结果赋值给C;
  5. 调用自己编写的函数int Palinstr(Char A[ ]),判别字符串A是否是回文,用0,1分别表示返回的结果。(注:回文例子:“aabbcbbaa”,”abccba”)
  6. 建议每个人添加一项自己设计的新功能
  7. 退出菜单
    //是我愚钝了,你虽然在外面声明可以免去你上传参数的麻烦
    //但是人家要指定呢,你怎么办?
    //人家要指定是哪个字符串的时候,你就不管用了
    //所以说最保险的还得是传参,除非是真的不需要你指定哪一个变量
    //直接使用的那种,
    //自己具体情况具体分析,结合方法需求
    //但万能的确实还得是传参
    
    //经验二
    //在自定义方法中,我传递了两次数组
    //而每次都只是传递了头结点,第一次把数组的头结点传参了上去
    //我没有遍历,又再一次的将这个头结点传到了length的函数中
    //因为我是二次传参,所以传的仅仅是我第一次传的头结点
    //所以无法往下遍历到数据,因为我传递的是仅有头结点的副本!
    //第一次的数组已经丢失了
    //也就是说,一般传递数据,直接传头结点仅仅只能传一次,连续传递会丢失数据
    //因为本质上是创建副本
    
    //因此,要想连续传参,还得使用指针,直接指向数据,这样就不会丢失数据了
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    #include <string.h>
    
    char A[100], B[100], C[200];
    
    
    
    // 计算字符串长度
    
    int length(char x[]) {
    
    	int length = 0;
    
    	while (x[length] != '\0') {
    
    		length++;
    		//这步是长度和遍历数组同时进行
    		//移动下标的同时也计算了长度
    
    	}
    
    	return length;
    
    }
    //原理是跟链表是一样的,上传的时候只是上传了数组的头结点,但是它能根据头下标给检索到后面的数据
    //所以说也是可行的。
    
    // 拼接字符串
    
    void Catstr() {
    	//先将A接上,然后再拼接B
    
    	int lenA = length(A);
    
    	int lenB = length(B);
    
    	memcpy(C, A, lenA);
    	//memcpy函数
    	//拼接数组起始位置,被拼接的数组起始位置,拼接长度(指被拼接需要选定多长拼接上)
    
    	memcpy(C + lenA, B, lenB);
    	//注意拼接完A后起始位置要变动!
    
    	C[lenA + lenB] = '\0';
    
    }
    
    // 插入字符串
    
    void Insertstr(int k) {
    
    	//同样,也是使用拼接函数
    	
    	//思路:先拼接到K位置,然后直接去拼B,再把剩下的A拼好。
    
    	int lenA = length(A);
    
    	int lenB = length(B);
    
    	memcpy(C, A, k);
    
    	memcpy(C + k, B, lenB);
    
    	memcpy(C + k + lenB, A + k, lenA - k);
    
    	C[lenA + lenB] = '\0';
    
    
    }
    
    // 判断回文
    
    int Palinstr(char x[]) {
    
    	int len = length(x);
    
    	int i, j;
    
    	for (i = 0, j = len - 1; i < j; i++, j--) {
       //当交叉或者重叠时,即i>j或i==j时,即判断完毕
    
    		if (x[i] != x[j]) {
    
    			return 0;
    
    		}
    
    	}
    
    	return 1;
    
    }
    
    // 自定义功能:反转字符串
    
    //void customFunction(char x[])  连续两次传参,会丢失原先数据,所以改用指针
    void customFunction(char* x)
    {
    	int len = length(x);
    	char reversed[100];
    
    	// 反转字符串
    	for (int i = 0; i < len; i++) {
    		reversed[i] = x[len - 1 - i];
    		//收尾对换即可
    	}
    	reversed[len] = '\0';
    
    	printf("反转后的字符串为:%s\n", reversed);
    }
    
    int main() {
    
    	
    
    	// 菜单项选择
    
    	while (1) {
    
    		printf("\n请选择操作:\n");
    
    		printf("1. 初始化字符串\n");
    
    		printf("2. 计算字符串长度\n");
    
    		printf("3. 拼接字符串\n");
    
    		printf("4. 插入字符串\n");
    
    		printf("5. 判断回文\n");
    
    		printf("6. 反转字符串\n");
    
    		printf("7. 退出菜单\n");
    
    		printf("请选择菜单项:");
    
    		int choice;
    
    		scanf("%d", &choice);
    
    		switch (choice) {
    
    		case 1: // 初始化字符串
    
    			//字符串插入后末尾自动为0,不需要自己添加!
    			printf("请输入字符串A:");
    
    			scanf("%s", A);
    
    			printf("请输入字符串B:");
    
    			scanf("%s", B);
    
    			printf("请输入字符串C:");
    
    			scanf("%s", C);
    
    			break;
    
    		case 2: // 计算字符串长度
    
    			printf("字符串A的长度为:%d\n", length(A));
    
    			break;
    
    		case 3: // 拼接字符串
    
    			Catstr();
    
    			printf("拼接后的字符串为:%s\n", C);
    
    			break;
    
    		case 4: // 插入字符串
    
    
    			printf("请输入插入位置:");
    
    			int k;
    
    			scanf("%d", &k);
    
    			Insertstr(k);
    
    			printf("插入后的字符串为:%s\n", C);
    
    			break;
    
    		case 5: // 判断回文
    
    			if (Palinstr(A)) {
    
    				printf("字符串A是回文\n");
    
    			}
    			else {
    
    				printf("字符串A不是回文\n");
    
    			}
    
    			break;
    
    		case 6: // 自定义功能
    
    		/*	printf("请输入你想要反转的字符串");
    
    			
    			scanf("%s", &x);
    			customFunction(x);  err*/
    
    			//不能这么写,系统是会辨认出来的
    			//你传递的是这个字母还是数组
    			//所以还得是直接选择来的实际
    			//系统会判定你输入上传的是什么,你不能间接式的输入!
    
    			printf("请选择想要反转的字符串: 1.字符串A 2.字符串B 3.字符串C\n ");
    			int num;
    			scanf("%d", &num);
    
    			switch (num)
    			{
    			case 1:
    				customFunction(A);
    				break;
    			case 2:
    				customFunction(B);
    				break;
    			case 3:
    				customFunction(C);
    				break;
    			default:
    				printf("非法输入!");
    				break;
    
    			
    			}
    
    			break;
    
    		case 7: // 退出菜单
    
    			return 0;
    
    		default:
    
    			printf("无效的选择,请重新选择。\n");
    
    		}
    
    	}
    
    }
    

更多推荐

数据结构与算法(六)--链表的遍历,查询和修改,删除操作

一、前言上篇文章我们了解了链表的概念以及链表底层的搭建以及向链表中添加元素的操作。本次我们继续学习链表剩余的操作:遍历,查询和修改、删除操作。二、链表查询以及遍历①获得链表的第index(0-based)个位置的元素(不常用,仅做练习)和add不一样的是,add我们是要找到第Index的前一个元素,所以,我们起点从du

MyBatis 动态 SQL、MyBatis 标签、MyBatis关联查询

MyBatis动态SQL、MyBatis标签、MyBatis关联查询1、MyBatis动态sql的特性2、MyBatis标签2.1、if标签:条件判断2.2、where+if标签2.3、set标签2.4、choose(when,otherwise)语句2.5、trim2.6、MyBatisforeach标签3、整合案例

Linux内核源码分析 (B.8)深度解析 slab 内存池回收内存以及销毁全流程

Linux内核源码分析(B.8)深度解析slab内存池回收内存以及销毁全流程文章目录Linux内核源码分析(B.8)深度解析slab内存池回收内存以及销毁全流程1\.内存释放之前的校验工作2\.slabcache在快速路径下回收内存3\.slabcache在慢速路径下回收内存3.1直接释放对象回slab,调整slab相

在AOSP中根据设备特性进行个性化定制:利用getPackageManager().hasSystemFeature()接口实现

在AOSP中根据设备特性进行个性化定制:利用getPackageManager().hasSystemFeature()接口实现前言AOSP原生框架是Android开放源代码项目的一部分,它不仅支持普通手机设备,还需要针对一些特殊设备(如汽车和手表等)提供定制化的功能。由于这些特殊设备的行为方式与手机系统不完全一致,因

SpringMVC之自定义注解

目录一.JAVA注解简介1.1.Java注解分类1.2.JDK元注解二.自定义注解1.1.如何自定义注解1.2.自定义注解的基本案例1.2.1.案例一(获取类与方法上的注解值)1.2.2.案例二(获取类属性上的注解属性值)1.2.3.案例三(获取参数修饰注解对应的属性值)三.Aop自定义注解的应用好啦,今天的分享就到这

vivado乘法器IP核进行无符号与有符号数相乘问题的验证

本文验证乘法器IP核Multiplier进行无符号(unsigned)与有符号数(signed)相乘的正确性,其中也遇到了一些问题,做此记录。配套工程:https://download.csdn.net/download/weixin_48412658/88354179文章目录问题的讨论验证过程IP核配置例化乘法器仿真

MySQL迁移到达梦数据库实战(使用达梦的DTS迁移工具)

1.mysql源库授权grantselecton*.*todm_read@'%'identifiedby'password';flushprivileges;2.设置数据类型映射设置varchar按字符存储,char也改成varcharchar,(选择强制为字符存储为是,意思是mysql定义的varchar(n)或者c

Simple Factory 简单工厂模式简介与 C# 示例【创建型3.1】【设计模式来了_3.1】

〇、简介1、什么是简单工厂模式?一句话解释:客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类。简单工厂模式(SimpleFactoryPattern)是日常开发中常用的设计模式。其是一种简单的创建型模式,它通过一个工厂类来创建对象,客户端只需要知道如何使用工厂类,而不需要知道对象的实现细节。工厂类负责创

uni-app 实现自定义按 A~Z 排序的通讯录(字母索引导航)

创建convertPinyin.js文件convertPinyin.js将下面的内容复制粘贴到其中constpinyin=(function(){letPinyin=function(ops){this.initialize(ops);},options={checkPolyphone:false,charcase:"

【无标题】

前言:JavaScript数组排序是一种常见的技术,它允许我们对数组中的元素进行排序。在本文中,我们将探讨JavaScript数组排序的背景、原理、使用场景、具体实现代码以及一些注意事项,并最后进行全文总结。背景:在编程中,排序是一种将元素按照一定规则重新排列的操作。在JavaScript中,数组是一种常用的数据结构,

在电脑上怎么分类管理笔记?支持分类整理的电脑云笔记软件

对于大多数上班族而言,在使用电脑办公时,随手记录工作笔记是一个非常常见的场景。无论是会议纪要、工作总结还是项目计划,记录下每一次思考和灵感是提高工作效率的关键。然而,随着时间的推移,电脑上记录的笔记内容逐渐增多,如何高效地管理这些笔记就成为了一项重要的任务。那么,在电脑上如何分类管理笔记呢?支持分类整理的电脑云笔记软件

热文推荐