利用C语言编程平台以及所学的编程知识,完成以下工作:
- //是我愚钝了,你虽然在外面声明可以免去你上传参数的麻烦
- //但是人家要指定呢,你怎么办?
- //人家要指定是哪个字符串的时候,你就不管用了
- //所以说最保险的还得是传参,除非是真的不需要你指定哪一个变量
- //直接使用的那种,
- //自己具体情况具体分析,结合方法需求
- //但万能的确实还得是传参
-
- //经验二
- //在自定义方法中,我传递了两次数组
- //而每次都只是传递了头结点,第一次把数组的头结点传参了上去
- //我没有遍历,又再一次的将这个头结点传到了length的函数中
- //因为我是二次传参,所以传的仅仅是我第一次传的头结点
- //所以无法往下遍历到数据,因为我传递的是仅有头结点的副本!
- //第一次的数组已经丢失了
- //也就是说,一般传递数据,直接传头结点仅仅只能传一次,连续传递会丢失数据
- //因为本质上是创建副本
-
- //因此,要想连续传参,还得使用指针,直接指向数据,这样就不会丢失数据了
- #define _CRT_SECURE_NO_WARNINGS
- #include
-
- #include
-
- 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");
-
- }
-
- }
-
- }