C++ Cout在循环通过const char时提供垃圾输出

C++ Cout在循环通过const char时提供垃圾输出,c++,arrays,const-char,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; +

在执行以下代码时,我得到了预期的结果和一些意外的输出:

#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;
    }
}
最后剩下的字符是什么?const char数组中是否有未被解释的内容

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

数组不包含空字符

因此,循环在数组上迭代,并超出其边界。访问边界之外的数组的行为是未定义的。

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;
    }
}

当*cp时,除非数组中有一个'0'nul终止符,否则条件永远不会变为假。@πάνταῥεῖ 从技术上讲,它是“\0”字符,与“0”不同。@AlgirdasPreidžius在编辑我的评论时,肯定是在编辑\这个字符,实际上是“\0”。把这些东西放在背景中似乎很难:
const  char ca[] = {'h', 'e', 'l', 'l', 'o'};
#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;
    }
}