C++ C++;While语句和字符串处理混乱?
然后我取消对“printf”语句的注释:C++ C++;While语句和字符串处理混乱?,c++,C++,然后我取消对“printf”语句的注释: h e l l o // end 为什么结果如此不同?“While”条件是如何存在的(精确的*cp值)? C++底漆第五页110 < /P> hello%s h e l l o % s // end 此循环条件正在循环,直到找到NUL字符为止。这相当于: while(*cp) ca不是NUL终止的,因此循环从数组末尾运行并调用未定义的行为。未定义的行为意味着任何事情都可能发生。† 要解决此问题,请添加一个NUL终止符 while(
h
e
l
l
o
// end
为什么结果如此不同?“While”条件是如何存在的(精确的*cp值)?
C++底漆第五页110 < /P>
hello%s
h
e
l
l
o
%
s
// end
此循环条件正在循环,直到找到NUL字符为止。这相当于:
while(*cp)
ca
不是NUL终止的,因此循环从数组末尾运行并调用未定义的行为。未定义的行为意味着任何事情都可能发生。†
要解决此问题,请添加一个NUL终止符
while(*cp != '\0')
或者,相当于
const char ca[] = {'h','e','l','l','o','\0'};
†在第一种情况下,循环似乎立即结束,因为在
'o'
后面的内存中碰巧有一个NUL字节。但是在第二种情况下,“%s”
字符串恰好与ca
相邻,因此也会打印出来<代码>“%s”是正确的NUL终止符,因此循环在打印后结束。
一个无害的printf()
调用可以改变一个不相关循环的行为,这就是一个不可预测的未定义行为的例子。它并不总是那么温和。这可能会使你的程序崩溃。它甚至可以让它继续工作一段时间,然后再以一种完全令人困惑的方式行为不端。不要依赖未定义的行为来预测行为。
此循环条件正在循环,直到找到NUL字符为止。这相当于:
while(*cp)
ca
不是NUL终止的,因此循环从数组末尾运行并调用未定义的行为。未定义的行为意味着任何事情都可能发生。†
要解决此问题,请添加一个NUL终止符
while(*cp != '\0')
或者,相当于
const char ca[] = {'h','e','l','l','o','\0'};
†在第一种情况下,循环很快结束,因为内存中碰巧有一个NUL字节,遵循
'o'
。但是在第二种情况下,“%s”
字符串恰好与ca
相邻,因此也会打印出来<代码>“%s”是正确的NUL终止符,因此循环在打印后结束。
一个无害的printf()
调用可以改变一个不相关循环的行为,这就是一个不可预测的未定义行为的例子。它并不总是那么温和。这可能会使你的程序崩溃。它甚至可以让它继续工作一段时间,然后再以一种完全令人困惑的方式行为不端。不要依赖未定义的行为来预测行为。