我正在尝试创建一个接受字符串的函数,将其反转,这都是在main中完成的。这是我到目前为止所拥有的。
#include <cstring>
#include <iostream>
#include <string>
std::string str = "zombie";
void Reverse( std::string a)
{
char* a1 = a.c_str;
char* a2;
for (int i = (strlen(a1) -1); a1[i]!=0; i--)
{
a2 += a1[i];
}
str = a2;
}
int main()
{
Reverse(str);
std::cout << str << std::endl;
}
但我一直收到这个错误。我不能在这个问题中使用指针。有什么建议吗?
编辑:我特别遇到将插入参数a转换为c风格字符串的问题。
编辑2:所以我开始清理它,根据我的理解,即使进行了适当的更改,我所拥有的代码根本无法实现我的目标。这会走上更好的轨道吗?我计划在将字符串传递给函数之前将字符串转换为c样式。void Reverse(const char* s)
{
int x = strlen(s);
std::string str = "";
for (int c = x; c > 0; c--)
{
str += s[c];
}
}
答案 0 :(得分:0)
该功能完全无效。
例如,参数应声明为std::string &
。
当函数依赖于全局变量时,这是一个坏主意。
在本声明中
char* a1 = a.c_str;
有两个错误。首先,而不是a.c_str
必须有a.c_str()
。成员函数c_str
返回一个常量指针。
这个指针
char* a2;
具有不确定的价值。
因此,到目前为止,您还不知道如何使用C ++编写函数,那么我将只展示其实现的几种变体。
最简单的是以下
#include <iostream>
#include <string>
std::string & Reverse( std::string &s )
{
s.assign(s.rbegin(), s.rend());
return s;
}
int main()
{
std::string s = "zombie";
std::cout << s << std::endl;
std::cout << Reverse(s) << std::endl;
return 0;
}
该函数使用class std::string
的反转迭代器。
另一种方法是使用标题std::reverse
<algorithm>
#include <iostream>
#include <string>
#include <algorithm>
std::string & Reverse(std::string &s)
{
std::reverse(s.begin(), s.end());
return s;
}
int main()
{
std::string s = "zombie";
std::cout << s << std::endl;
std::cout << Reverse(s) << std::endl;
return 0;
}
如果你想使用循环自己编写函数,那么它的实现看起来像
#include <iostream>
#include <string>
std::string & Reverse(std::string &s)
{
for (std::string::size_type i = 0, n = s.size(); i < n / 2; i++)
{
//std::swap(s[i], s[n - i - 1]);
char c = s[i];
s[i] = s[n - i - 1];
s[n - i - 1] = c;
}
return s;
}
int main()
{
std::string s = "zombie";
std::cout << s << std::endl;
std::cout << Reverse(s) << std::endl;
return 0;
}
在所有三种情况下,程序输出看起来像
zombie
eibmoz
您也可以尝试使用迭代器(双向或随机)而不是索引来自己编写函数。