第一个循环是完美的。第二行不通。 “Z”有什么问题。 为什么循环不停止? 当我在表中给出“Z”时,循环没有反应。
#include <iostream>
using namespace std;
int main()
{
char tab[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z' };
char *wsk = tab;
while(*wsk <= 'Y')
{
cout << *wsk << " ";
wsk++;
}
cout << endl;
wsk = tab;
while(*wsk <= 'Z')
{
cout << *wsk << " ";
wsk++;
}
cout << endl;
}
最佳答案
'Z'
是数组的最后一个元素。在(应该是)最后一次迭代结束时,wsk
递增以指向超出数组的最后一个元素。在下一次迭代中,*wsk <= 'Z'
通过超出范围的指针进行间接访问,尝试访问不存在的对象,并且程序的行为未定义。
循环整个数组的简单解决方案:
for(char c : tab)
使用指针的解决方案:
char* end = std::end(tab);
for(char* wsk = tab; wsk != end; wsk++)
您可以根据条件提前中断循环:
for(char c : tab) {
std::cout << c;
if (c >= 'Z')
break;
}
如果你特别想要一个循环,当遇到某个值时结束,但是那个元素也必须迭代,并且确定该值保证存在,并且由于某种原因无法知道数组的长度,那么你可以使用:
wsk = tab;
do {
char c = *wsk++;
std::cout << c;
} while(c < 'Z');
但请注意,如果数组中不存在该元素,这也会有 UB。
关于c++ - 使用指针写入数组元素的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57313690/