任务要求:将输入的字符串倒序,不使用标准库的函数reverse
方法一:使用char数组,运用动态内存分配;
需要注意的点:string对象不能像动态数组那样直接用,因为初始化之后是一个长度为1的空的字符串,一旦需要索引一个以上的字符就会出现问题。
class Solution {
public:
void reverseString(string s) {
//直接定一个空的string对象不太行:
//①res字符串在初始化时并没有指定大小,直接使用res[i]可能会引发未定义行为,因为res尚未分配足够的空间来存储反转后的字符串。
//②当i等于a - 1时,s[a - 1 - i]将尝试访问s[0],这是合法的。但是当i等于a时,s[a - 1 - i]将尝试访问s[-1],这是一个越界访问,会导致未定义行为。
//string res;//初始化一个空的字符串用于承接转换结果
//int a = s.length();
//for (int i = 0; i < a; i++) {
// res[i] = s[a - 1 - i];
//}
//return res;
string res;
const int n = s.length();//用输入字符串的长度去初始化数组的长度
char* arr = new char[n];
for (int i = 0; i < n; i++) {
arr[i] = s[n - 1 - i];
cout << arr[i];
}
}
};
int main() {
Solution s;
string str;
getline(cin, str);
s.reverseString(str);//这里没有cout因为成员函数没有返回值
return 0;
}
方法二:使用string类机器字符拼接方法
class Solution {
public:
string reverseString(string s) {
string res;//在类外初始化一个空的字符串,到循环里面去承接一个个的字符
int n = s.length();
for (int i = 0; i < n; i++) {
string x;
x = s[n - 1 - i];
res += x;
}
return res;
}
};
int main() {
Solution s;
string str;
getline(cin, str);
cout << s.reverseString(str);
return 0;
}