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


    利用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. 退出菜单
      1. //是我愚钝了,你虽然在外面声明可以免去你上传参数的麻烦
      2. //但是人家要指定呢,你怎么办?
      3. //人家要指定是哪个字符串的时候,你就不管用了
      4. //所以说最保险的还得是传参,除非是真的不需要你指定哪一个变量
      5. //直接使用的那种,
      6. //自己具体情况具体分析,结合方法需求
      7. //但万能的确实还得是传参
      8. //经验二
      9. //在自定义方法中,我传递了两次数组
      10. //而每次都只是传递了头结点,第一次把数组的头结点传参了上去
      11. //我没有遍历,又再一次的将这个头结点传到了length的函数中
      12. //因为我是二次传参,所以传的仅仅是我第一次传的头结点
      13. //所以无法往下遍历到数据,因为我传递的是仅有头结点的副本!
      14. //第一次的数组已经丢失了
      15. //也就是说,一般传递数据,直接传头结点仅仅只能传一次,连续传递会丢失数据
      16. //因为本质上是创建副本
      17. //因此,要想连续传参,还得使用指针,直接指向数据,这样就不会丢失数据了
      18. #define _CRT_SECURE_NO_WARNINGS
      19. #include
      20. #include
      21. char A[100], B[100], C[200];
      22. // 计算字符串长度
      23. int length(char x[]) {
      24. int length = 0;
      25. while (x[length] != '\0') {
      26. length++;
      27. //这步是长度和遍历数组同时进行
      28. //移动下标的同时也计算了长度
      29. }
      30. return length;
      31. }
      32. //原理是跟链表是一样的,上传的时候只是上传了数组的头结点,但是它能根据头下标给检索到后面的数据
      33. //所以说也是可行的。
      34. // 拼接字符串
      35. void Catstr() {
      36. //先将A接上,然后再拼接B
      37. int lenA = length(A);
      38. int lenB = length(B);
      39. memcpy(C, A, lenA);
      40. //memcpy函数
      41. //拼接数组起始位置,被拼接的数组起始位置,拼接长度(指被拼接需要选定多长拼接上)
      42. memcpy(C + lenA, B, lenB);
      43. //注意拼接完A后起始位置要变动!
      44. C[lenA + lenB] = '\0';
      45. }
      46. // 插入字符串
      47. void Insertstr(int k) {
      48. //同样,也是使用拼接函数
      49. //思路:先拼接到K位置,然后直接去拼B,再把剩下的A拼好。
      50. int lenA = length(A);
      51. int lenB = length(B);
      52. memcpy(C, A, k);
      53. memcpy(C + k, B, lenB);
      54. memcpy(C + k + lenB, A + k, lenA - k);
      55. C[lenA + lenB] = '\0';
      56. }
      57. // 判断回文
      58. int Palinstr(char x[]) {
      59. int len = length(x);
      60. int i, j;
      61. for (i = 0, j = len - 1; i < j; i++, j--) {
      62. //当交叉或者重叠时,即i>j或i==j时,即判断完毕
      63. if (x[i] != x[j]) {
      64. return 0;
      65. }
      66. }
      67. return 1;
      68. }
      69. // 自定义功能:反转字符串
      70. //void customFunction(char x[]) 连续两次传参,会丢失原先数据,所以改用指针
      71. void customFunction(char* x)
      72. {
      73. int len = length(x);
      74. char reversed[100];
      75. // 反转字符串
      76. for (int i = 0; i < len; i++) {
      77. reversed[i] = x[len - 1 - i];
      78. //收尾对换即可
      79. }
      80. reversed[len] = '\0';
      81. printf("反转后的字符串为:%s\n", reversed);
      82. }
      83. int main() {
      84. // 菜单项选择
      85. while (1) {
      86. printf("\n请选择操作:\n");
      87. printf("1. 初始化字符串\n");
      88. printf("2. 计算字符串长度\n");
      89. printf("3. 拼接字符串\n");
      90. printf("4. 插入字符串\n");
      91. printf("5. 判断回文\n");
      92. printf("6. 反转字符串\n");
      93. printf("7. 退出菜单\n");
      94. printf("请选择菜单项:");
      95. int choice;
      96. scanf("%d", &choice);
      97. switch (choice) {
      98. case 1: // 初始化字符串
      99. //字符串插入后末尾自动为0,不需要自己添加!
      100. printf("请输入字符串A:");
      101. scanf("%s", A);
      102. printf("请输入字符串B:");
      103. scanf("%s", B);
      104. printf("请输入字符串C:");
      105. scanf("%s", C);
      106. break;
      107. case 2: // 计算字符串长度
      108. printf("字符串A的长度为:%d\n", length(A));
      109. break;
      110. case 3: // 拼接字符串
      111. Catstr();
      112. printf("拼接后的字符串为:%s\n", C);
      113. break;
      114. case 4: // 插入字符串
      115. printf("请输入插入位置:");
      116. int k;
      117. scanf("%d", &k);
      118. Insertstr(k);
      119. printf("插入后的字符串为:%s\n", C);
      120. break;
      121. case 5: // 判断回文
      122. if (Palinstr(A)) {
      123. printf("字符串A是回文\n");
      124. }
      125. else {
      126. printf("字符串A不是回文\n");
      127. }
      128. break;
      129. case 6: // 自定义功能
      130. /* printf("请输入你想要反转的字符串");
      131. scanf("%s", &x);
      132. customFunction(x); err*/
      133. //不能这么写,系统是会辨认出来的
      134. //你传递的是这个字母还是数组
      135. //所以还得是直接选择来的实际
      136. //系统会判定你输入上传的是什么,你不能间接式的输入!
      137. printf("请选择想要反转的字符串: 1.字符串A 2.字符串B 3.字符串C\n ");
      138. int num;
      139. scanf("%d", &num);
      140. switch (num)
      141. {
      142. case 1:
      143. customFunction(A);
      144. break;
      145. case 2:
      146. customFunction(B);
      147. break;
      148. case 3:
      149. customFunction(C);
      150. break;
      151. default:
      152. printf("非法输入!");
      153. break;
      154. }
      155. break;
      156. case 7: // 退出菜单
      157. return 0;
      158. default:
      159. printf("无效的选择,请重新选择。\n");
      160. }
      161. }
      162. }

  • 相关阅读:
    Opencv实现信用卡识别
    数组转树形结构
    如何进行各个终端的页面适配(react项目安装插件 postcss-px-to-viewport)
    typescript80-使用配置文件编译文件
    文件的操作方法
    【C语言】进制转换一般方法
    测试右移-后台服务监控告警实践
    Listener监听器
    Elasticsearch通过Http请求实现索引操作以及文档操作
    [树形dp]Hanging Hearts Codeforces1740E
  • 原文地址:https://blog.csdn.net/ASBSIHD/article/details/133147529