C 可以做想要的|char [] cout和倒置的char []

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

本文关键字:char cout      更新时间:2023-10-16

我实际上正在使用C 反转字符串/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,则在字符上等等。倒立的字符串上有随机的炭,并且只有当我输入这些数字长度时。

我很困惑,因为此错误仅出现偶数。

这是一个小例子:这是一个小例子:

这是新代码(这里一切正常),我知道它与数组末端的/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] = '';
    cout << output << endl;
    delete output;
}
int main(int argc, char *argv[])
{
    while(true)
    {
        string in;
        cin >> in;
        inverse(in);
    }
    return 0;
}

任何人都可以帮助我找到解决方案吗?

您的字符串未终止。尝试

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

为此,您需要包括定义std::reverse()功能的algorithm标头。

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

您在字符串的末端有垃圾,因为它没有以结束。打印这样的字符串是C 中的一种不确定的行为。

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

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