True
但是我没有得到任何输出,但我可以打印反向字符串的元素。任何人都可以帮忙。
答案 0 :(得分:6)
string s2; // no size allocated
for(int a=0;a<n;a++)
{
s2[a]=s1[n-1-a]; // write to somewhere in s2 that doesn't exist yet
您正在撰写您从未创建过的s2
元素。这是Undefined Behaviour,可能会发生任何事情,包括看似正常工作。在这种情况下,您可能会覆盖内存中的一些随机位置。它可能会崩溃,或者内存可能确实存在,但不会立即破坏任何其他内容。你甚至可以在以后阅读它,但它似乎只能通过纯粹的意外工作。
您可以通过始终使用s2.at(a)
来访问数据来捕获此问题,因为它会为您进行范围检查。 ([]
不进行范围检查)。当然,这是一个成本,有时人们会在确定的情况下跳过它,指数不能超出范围。这是有争议的。在这种情况下,即使你可能确定你的数学是正确的,它仍然可以帮助捕捉这个错误。
您需要预先创建该空间,即创建一个充满正确数量的虚拟值的字符串,或者使用push_back
按需创建每个元素的空间。我可能会选择第一个选项:
string s2(s1.size(), '\0'); // fill with the right number of NULs
for(int a=0;a<n;a++)
{
s2.at(a)=s1.at(n-1-a); // overwrite the NULs
您可能希望选择一个未出现在测试数据中的可打印虚拟字符,例如'#'
,因为如果您无法正确覆盖某个元素,则在打印出来时它会变得非常明显。例如。如果您尝试撤消"abc"
,但是当您将其打印出来时,您会得到"cb#"
,这显然会有一些off-by-one error。
第二个选项有点贵,因为它可能需要在字符串增长时进行多次分配和复制,但这是它的外观:
string s2; // no space allocated yet
for(int a=0;a<n;a++)
{
s2.push_back(s1.at(n-1-a)); // create space on demand
我认为你这样做是为了学习练习,但我建议不要写自己的reverse
,因为语言provides it in the library。
答案 1 :(得分:4)
您正在使用代码中名为Undefined Behaviour的内容。您尝试在s2
位置访问a
元素,但您的字符串没有那么多字符(它是空的)。
你可以使用std::string::push_back函数在最后一个位置添加一个字符,所以你的代码看起来像这样:
for(int a=0;a<n;a++)
{
s2.push_back(s1[n-1-a]);
}
编辑,为了解决另一个问题,您的控制台窗口可能会在您注意到之前关闭。这就是为什么“你没有得到任何输出” 试试这个:How to stop C++ console application from exiting immediately?
答案 2 :(得分:3)
您可以在c ++中使用内置的反向函数
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
希望有所帮助:)
答案 3 :(得分:0)
您可以使用反向迭代器构造字符串:
std::string reverse ( std::string const& in )
{
return std::string { in.crbegin(), in.crend() };
}