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