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