Cout在遍历const char时给出垃圾输出

时间:2019-06-10 16:48:49

标签: c++ arrays 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数组中有没有被忽略的东西?

2 个答案:

答案 0 :(得分:5)

while (*cp)

cp指向空字符时,此循环结束。

const  char ca[] = {'h', 'e', 'l', 'l', 'o'};

该数组不包含空字符。

因此,循环在数组上及其边界之外迭代。在数组边界之外访问数组的行为是不确定的。

答案 1 :(得分:2)

while循环直到*cp等于0。

此修复程序:

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    const  char ca[] = { 'h', 'e', 'l', 'l', 'o', '\0' }; // <-- add '\0'
    const char* cp = ca;
    while (*cp) // loop until *cp equal '\0'
    {
        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;
    }
}