反转输入,输出字符串意外为空

时间:2018-05-23 06:29:51

标签: c++ string

True

但是我没有得到任何输出,但我可以打印反向字符串的元素。任何人都可以帮忙。

4 个答案:

答案 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() };
}