使用指针写数组元素的问题

kor*_*nel 1 c++ pointers loops while-loop do-while

第一个循环是完美的。第二不起作用。“ 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;
}

Run Code Online (Sandbox Code Playgroud)

eer*_*ika 6

'Z'是数组的最后一个元素。在最后一个迭代(应该是这样)的末尾,wsk递增以指向数组的最后一个元素之外。在下一次迭代中,*wsk <= 'Z'间接访问超出范围的指针,尝试访问不存在的对象,并且程序的行为未定义。

一个遍历整个数组的简单解决方案:

for(char c : tab)
Run Code Online (Sandbox Code Playgroud)

使用指针的解决方案:

char* end = std::end(tab);
for(char* wsk = tab; wsk != end; wsk++)
Run Code Online (Sandbox Code Playgroud)

您可以根据条件提前中断循环:

for(char c : tab) {
    std::cout << c;
    if (c >= 'Z')
        break;
}
Run Code Online (Sandbox Code Playgroud)

如果您特别想要一个循环,当遇到某个值时该循环结束,但是该元素也必须进行迭代,并且确定该值肯定存在,并且由于某种原因而无法知道数组的长度,那么您可以可能使用:

wsk = tab;
do {
    char c = *wsk++;
    std::cout << c;
} while(c < 'Z');
Run Code Online (Sandbox Code Playgroud)

但是请注意,如果该元素在数组中不存在,那么它也将具有UB。