字符串取反问题

问题:将字符串取反。

例如,“abcd” ---> "dcba"

这里的思想取自合并排序。下面的源码存在一个问题。目前我还没有解决掉,欢迎大家指导!!

 1 /* 
 2  * Q: 将字符串取反。例如,
 3  * “abcd” --> "dcba"
 4  */
 5 #include <iostream>
 6 #include <cstring>
 7 
 8 using namespace std;
 9 
10 void Merge(char *str, int start, int mid, int end)
11 {
12     int lenleft = mid - start + 1;
13     int lenright = end - mid;
14     char *pleft = new char[lenleft + 1];
15 
16     strncpy(pleft, str + start -1, lenleft);
17     strncpy(str + start - 1, str + mid, lenright);
18     strncpy(str + start + lenright - 1, pleft, lenleft);
19 
20     delete[] pleft;
21 }
22 
23 /* 
24  * 有一个BUG:需要在最后的时候加一个空格!
25  * 因为在转换过程中,删掉了最后一个字符。
26  */
27 void MergeString(char *str, int start, int end)
28 {
29     if (start < end) {
30         int mid = (start + end) / 2;
31 
32         MergeString(str, start, mid);
33         MergeString(str, mid + 1, end);
34         Merge(str, start, mid, end);
35   //      cout << str << endl;
36     }
37 }
38 
39 int main()
40 {
41     char str[] = "abcd ";
42 
43     cout << "Before: \n" << str << endl;
44 
45     cout << "\nin service: \n";
46     MergeString(str, 0, strlen(str));
47 
48     cout << "\nAfter: \n" << str << endl;
49 
50     return 1;
51 }

 

转载于:https://www.cnblogs.com/life91/archive/2013/03/22/2975779.html

### C语言中字符串反转的实现方法 在C语言中,字符串反转可以通过多种方式实现。以下是几种常见的实现方法及其特点。 #### 方法一:基于指针交换法 通过定义两个指针分别指向字符串首部和尾部,逐步向中心移动并交换对应的字符完成反转操作[^1]。 ```c #include <stdio.h> #include <string.h> void reverseString(char* str) { int start = 0; int end = strlen(str) - 1; while (start < end) { char temp = str[start]; str[start++] = str[end]; str[end--] = temp; } } int main() { char input[1024]; printf("请输入字符串:"); fgets(input, sizeof(input), stdin); input[strcspn(input, "\n")] = '\0'; // 移除换行符[^3] reverseString(input); printf("反转后的字符串:%s\n", input); return 0; } ``` 此方法利用双指针技术,时间复杂度为O(n),空间复杂度为O(1)。 --- #### 方法二:递归实现 递归是一种优雅的方式用于解决字符串反转问。每次处理字符串的第一个字符最后一个字符的位置互换,并逐渐缩小范围直到整个字符串被完全反转[^2]。 ```c #include <stdio.h> #include <string.h> void recursiveReverse(char* begin, char* end) { if (begin >= end) return; char temp = *begin; *begin++ = *end; *end-- = temp; recursiveReverse(begin, end); } int main() { char input[1024]; printf("请输入字符串:"); fgets(input, sizeof(input), stdin); input[strcspn(input, "\n")] = '\0'; recursiveReverse(input, input + strlen(input) - 1); printf("反转后的字符串:%s\n", input); return 0; } ``` 这种方法虽然简洁明了,但在大规模数据上可能会因为栈溢出而失败。 --- #### 方法三:标准库函数辅助 可以借助`strrev()`函数来快速实现字符串反转功能(注意该函数并非ANSI C标准的一部分,在某些编译器环境下可能不可用)。如果需要跨平台兼容性较高的解决方案,则不推荐使用这种方式。 ```c #include <stdio.h> #include <string.h> char* string_reverse(char* str) { int length = strlen(str); for(int i = 0; i < length / 2; ++i){ char tmp = str[i]; str[i] = str[length - i - 1]; str[length - i - 1] = tmp; } return str; } int main(){ char buffer[60]; printf("Enter a string: "); fgets(buffer, sizeof(buffer), stdin); buffer[strcspn(buffer, "\n")] = '\0'; printf("Reversed String: %s\n", string_reverse(buffer)); return 0; } ``` 上述代码展示了如何手动模拟`strrev()`的行为以增强可移植性和可靠性。 --- ### 性能分析 三种方法各有优劣: - **指针交换法**效率高且易于理解; - **递归法**适合教学演示但实际应用需谨慎考虑堆栈限制; - 使用**标准库函数**最为简单直接不过依赖具体环境支持情况。 综上所述,对于大多数场景而言采用循环迭代形式会更加稳健可靠.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值