如何解决打印所有字符后打印乱码C ++
我有以下代码:
# include <iostream>
using std::cout;
const int ARRAY_SIZE = 15;
union one4all
{
int int_value;
long long_value;
double double_value;
char char_value[ARRAY_SIZE];
};
int main()
{
one4all x;
for (int i = 0; i < ARRAY_SIZE; ++i)
{
x.char_value[i] = (int)(i + 97);
}
cout << x.char_value << '\n';
system("pause");
}
此代码在最后一个字符值之后打印乱码。然后,经过一些研究,它说这是因为它无法检测到终止字符,因此继续打印。
https://i.stack.imgur.com/7MFvS.png
因此,我将代码更新为:
# include <iostream>
using std::cout;
const int ARRAY_SIZE = 15;
union one4all
{
int int_value;
long long_value;
double double_value;
char char_value[ARRAY_SIZE];
};
int main()
{
one4all x;
for (int i = 0; i < ARRAY_SIZE; ++i)
{
x.char_value[i] = (int)(i + 97);
}
x.char_value[ARRAY_SIZE - 1] = '\0';
cout << x.char_value << '\n';
system("pause");
}
这非常有效,因为它的末尾带有终止符。
https://i.stack.imgur.com/WVsBB.png
这引起了疑问:
解决方法
为什么第15个字符后仍继续打印?我知道它无法检测到任何终止符,但是,嘿!它知道字符数组的大小吗?
“ it”通常是指编译器,但您调用了流函数operator<<(std::ostream&,const char*)
-仅由于数组已衰减为指针且长度丢失,因此该函数才匹配。这就是标准库函数的编写方式。
如果它试图变得更聪明,则仍然不清楚哪种方法最有效:说标准库提供了...
template <size_t N>
std::ostream& operator<<(std::ostream&,const char(&)[N]);
...因此可以使用有关数组大小的知识-它应该始终流传输由字符数组大小确定的多个字符,还是在遇到NUL
时尽早停止?
如果您用一个char[]
参数调用一个非模板函数,它将趋向于衰减到char*
函数参数,而被调用函数不能然后提供数组大小(如果它尝试流式传输该值)。
总而言之,当文本缓冲区和指向它们的指针在程序周围传递时,流运算符利用数组大小的知识的想法并没有成立。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。