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

利用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");
    
    		}
    
    	}
    
    }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值