利用C语言编程平台以及所学的编程知识,完成以下工作:
- 采用菜单形成,通过菜单项(1;2;3;......)等选择方式,分别实现以下对字符串(字符数组)的各种操作功能:
- 初始化字符串(字符数组)A[ ],B[ ],C[ ]等,并键盘录入,要求字符串(字符数组)以’\0’为结束标志;
- 调用自己编写的函数int length(Char A[ ]),计算一个字符串A的长度;
- 调用自己编写的函数void Catstr(Char A[ ],Char B[ ],Char C[ ]),把字符串A,B拼接后,赋值给C;
- 调用自己编写的函数void Insertstr (Char A[ ],Char B[ ],Char C[ ],int k),在字符串A中第k个位置后面,插入字符串B,把插入完成后的结果赋值给C;
- 调用自己编写的函数int Palinstr(Char A[ ]),判别字符串A是否是回文,用0,1分别表示返回的结果。(注:回文例子:“aabbcbbaa”,”abccba”)
- 建议每个人添加一项自己设计的新功能
- 退出菜单
//是我愚钝了,你虽然在外面声明可以免去你上传参数的麻烦 //但是人家要指定呢,你怎么办? //人家要指定是哪个字符串的时候,你就不管用了 //所以说最保险的还得是传参,除非是真的不需要你指定哪一个变量 //直接使用的那种, //自己具体情况具体分析,结合方法需求 //但万能的确实还得是传参 //经验二 //在自定义方法中,我传递了两次数组 //而每次都只是传递了头结点,第一次把数组的头结点传参了上去 //我没有遍历,又再一次的将这个头结点传到了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"); } } }