C++ 做它想做的事 | Char[] cout 和 inverted char[]

C++ does what it wants | Char[] cout and inverted char[]

我实际上正在研究 C++ 反转 String/Char[] 方法

#include <iostream>

using namespace std;

void inverse(string input)
{
    int length = input.length();
    char* output = new char[length];

    for(int i = 0; i < length; i++)
    {
        output[length - (i + 1)] = input[i];
    }

    cout << output << endl;
    delete output;
}

int main(int argc, char *argv[])
{
    while(true)
    {
        string in;
        cin >> in;
        inverse(in);
    }

    return 0;
}

问题是,当我输入一个包含 3/5/7 等字母的字符串时,它会反转,然后如果它正确,但如果我输入一个长度为 2/4/6 等的字符串在字符上,倒置的字符串在他身上有随机字符,并且只有当我输入这些长度的数字时。

我很困惑,因为这个错误只出现在偶数上。

这是一个小例子: Here's a little example:

这是新代码(这里一切正常),我知道它与数组末尾的 /0 有关,但为什么只有偶数。

#include <iostream>

using namespace std;

void inverse(string input)
{
    int length = input.length();
    char* output = new char[length + 1];

    for(int i = 0; i < length; i++)
    {
        output[length - (i + 1)] = input[i];
    }

    output[length] = '[=11=]';
    cout << output << endl;
    delete output;
}

int main(int argc, char *argv[])
{
    while(true)
    {
        string in;
        cin >> in;
        inverse(in);
    }

    return 0;
}

谁能帮我找到解决办法?

你的字符串末尾有乱码,因为它不是以 [=10=] 结尾的。打印此类字符串是 c++ 中的未定义行为。

您很幸运,您的代码能在偶数长度上工作。例如,在我的机器上,它适用于 1、2、3、5、6、7 和 8 的长度,并打印 4 的垃圾。

UP: 实际上,尽量避免使用 UB:c++ 标准没有指定当你拥有 UB 时会发生什么 - 理论上,你的程序可能会崩溃,或者你的计算机可能会炸毁,否则恶魔可能会从你的鼻子里出现。在这种特殊情况下,如果您出于某种原因无法使用 std::reverse 或手动就地完成所有工作,我建议使用 std::string 作为 output 的容器。

您的字符串不是 null-terminated。尝试

void inverse(string input)
{
    reverse( input.begin(), input.end() );
    cout << input << endl;
}

为此,您需要包含定义 std::reverse() 函数的 algorithm header。

它对偶数不起作用的原因可能是内存分配通常会保留更多的内存,以便内存边界正确对齐。因此,四舍五入为偶数并不浪费。那只是一个猜测。但是,我强烈建议您避免未定义的行为。