C ++做它想要的东西Char [] cout和倒置char []

时间:2016-12-06 09:25:55

标签: c++ string char cout invert

我实际上正在研究C ++ Invert 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] = '\0';
    cout << output << endl;
    delete output;
}

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

    return 0;
}

有人可以帮我找到解决方案吗?

2 个答案:

答案 0 :(得分:3)

您的字符串不是以空值终止的。尝试

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

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

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

答案 1 :(得分:0)

你的字符串末尾有垃圾,因为它没有以\0结尾。在c ++中打印这样的字符串是一种未定义的行为。

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

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

相关问题