编写一字符串移动函数char *shift(char *pstr, int n, char mode),该函数的功能是: (1)当mode = ‘R’时,将字符串pstr循环右移n位; (2)当mode = ‘L’时,将字符串pstr循环左移n位; 返回值为移位后的字符串的首地址。
时间: 2024-02-18 18:00:23 浏览: 26
好的,我来为您编写这个字符串移动函数。
```c++
#include <iostream>
#include <cstring>
using namespace std;
char* shift(char* pstr, int n, char mode)
{
int len = strlen(pstr);
char* result = new char[len + 1];
strcpy(result, pstr);
if (mode == 'R') {
n %= len;
if (n == 0) {
return result;
}
reverse(result, result + len);
reverse(result, result + n);
reverse(result + n, result + len);
} else if (mode == 'L') {
n %= len;
if (n == 0) {
return result;
}
reverse(result, result + n);
reverse(result + n, result + len);
reverse(result, result + len);
}
return result;
}
int main()
{
char str[] = "Hello, World!";
cout << shift(str, 3, 'R') << endl; // 输出:ld!Hello, Wor
cout << shift(str, 2, 'L') << endl; // 输出:llo, World!He
return 0;
}
```
这个函数接受3个参数:原字符串指针pstr、移动位数n和移动模式mode。函数会先将原字符串复制到一个新字符串中,然后根据移动模式和移动位数对新字符串进行移动操作。最后返回移动后的新字符串的首地址。
具体地,当移动模式为'R'时,表示循环右移n位,函数会先将n取模(因为当n大于字符串长度时,移动n位和移动n%len位是等价的),然后先将整个字符串翻转,再将前n个字符翻转,最后将后面的字符翻转即可。
当移动模式为'L'时,表示循环左移n位,函数会先将n取模,然后先将前n个字符翻转,再将后面的字符翻转,最后将整个字符串翻转即可。
注意,由于函数中使用了动态内存分配,所以使用完毕后需要手动释放内存,否则可能会导致内存泄漏。