Cout 在遍历 const char 时给出垃圾输出
Cout giving garbage output when looping through a const char
当执行下面的代码时,我得到了我所期望的以及一些意外的输出:
#include <iostream>
using std::cout;
using std::endl;
int main()
{
const char ca[] = {'h', 'e', 'l', 'l', 'o'};
const char *cp = ca;
while (*cp)
{
cout << *cp << endl;
++cp;
}
}
输出:
h
e
l
l
o
ⁿ
■
m
最后剩下的字符是什么? const char 数组中是否有未考虑的内容?
while (*cp)
当cp
指向一个空字符时,这个循环结束。
const char ca[] = {'h', 'e', 'l', 'l', 'o'};
数组中没有空字符。
因此循环遍历数组,并超出其边界。访问超出其范围的数组的行为是未定义的。
while
循环直到 *cp
等于 0。
此修复:
#include <iostream>
using std::cout;
using std::endl;
int main()
{
const char ca[] = { 'h', 'e', 'l', 'l', 'o', '[=10=]' }; // <-- add '[=10=]'
const char* cp = ca;
while (*cp) // loop until *cp equal '[=10=]'
{
cout << *cp << endl;
++cp;
}
}
或者这样:
#include <iostream>
using std::cout;
using std::endl;
int main()
{
const char ca[] = { "hello" };
const char* cp = ca;
while (*cp)
{
cout << *cp << endl;
++cp;
}
}
当执行下面的代码时,我得到了我所期望的以及一些意外的输出:
#include <iostream>
using std::cout;
using std::endl;
int main()
{
const char ca[] = {'h', 'e', 'l', 'l', 'o'};
const char *cp = ca;
while (*cp)
{
cout << *cp << endl;
++cp;
}
}
输出:
h
e
l
l
o
ⁿ
■
m
最后剩下的字符是什么? const char 数组中是否有未考虑的内容?
while (*cp)
当cp
指向一个空字符时,这个循环结束。
const char ca[] = {'h', 'e', 'l', 'l', 'o'};
数组中没有空字符。
因此循环遍历数组,并超出其边界。访问超出其范围的数组的行为是未定义的。
while
循环直到 *cp
等于 0。
此修复:
#include <iostream>
using std::cout;
using std::endl;
int main()
{
const char ca[] = { 'h', 'e', 'l', 'l', 'o', '[=10=]' }; // <-- add '[=10=]'
const char* cp = ca;
while (*cp) // loop until *cp equal '[=10=]'
{
cout << *cp << endl;
++cp;
}
}
或者这样:
#include <iostream>
using std::cout;
using std::endl;
int main()
{
const char ca[] = { "hello" };
const char* cp = ca;
while (*cp)
{
cout << *cp << endl;
++cp;
}
}