我实际上正在研究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;
}
有人可以帮我找到解决方案吗?
答案 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
的容器。