#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <algorithm>
using namespace std;
/*分析过程:
假设要使传递的字符串为常量const字符串,这样操作更加灵活,
可直接传递字符串字面值进行反转,常见的解决方法就是,定义一个新的与传递过来字符串长度
相等的字符数组,然后进行字符串拷贝,把str字符按从左到右放置到字符数组中,
然后采用循环来对字符数组中字符反转
*/
//第一种,采用以上思路解法,传递为const类型C风格字符指针,返回为char*类型
char* strrev1(const char* str){
const size_t length = strlen(str); // 求字符串长度
auto *temp = new char[length]; // 新建一个等长度的字符数组
strcpy(temp, str); // 字符串的拷贝
for (size_t i = 0; i < length/2; ++i) { // 对字符数组中的字符串翻转
char c = temp[i];
temp[i] = temp[length - i - 1];
temp[length -i -1] = c;
}
return temp;
}
//采用指针操作方式
char* strrev2(const char* str){
char* temp = new char[strlen(str)];
strcpy(temp, str);
char *ret = temp; // 用来最后返回数组指针
char *p = temp + strlen(str) -1;
while (p>temp){
char t = *temp;
*temp++ = *p;
*p-- = t;
}
return ret;
}
// 接给新建的字符数组赋反转的值
char* strrev3(const char* str){
char* temp = new char[strlen(str)];
for (int i = 0; i < strlen(str); ++i) {
temp[i] = str[strlen(str) - i -1];
}
return temp;
}
//如果传递是std::string类型字符串且是const的
string strrev4(const string str){
string r;
for (int i = 0; i < str.length(); ++i) {
r = str[i] + r;
}
return r;
}
// 如果传递是std::string类型字符串,但不是const的
string strrev5(string str){
for (int i = 0; i < str.length()/2; ++i) {
char c = str[i];
str[i] = str[str.length() -i -1];
str[str.length() -i -1] = c;
}
return str;
}
// 直接调用算法
string strrev6(string str){
reverse(str.begin(), str.end());
return str;
}
int main() {
char str[] = "abcdefg";
auto newStr = strrev1(str);
cout << newStr << endl;
auto newStr2 = strrev2(str);
cout << newStr2 << endl;
auto newStr3 = strrev3(str);
cout << newStr3 << endl;
string r = "abcdefgh";
auto newStr4 = strrev4(r);
cout << newStr4 << endl;
auto newStr5 = strrev5(r);
cout << newStr5 << endl;
auto newStr6 = strrev6(r);
cout << newStr6 << endl;
}