c++ - 使用指针写入数组元素的问题

标签 c++ loops pointers 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;
}

最佳答案

'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/

相关文章:

c++ - iMAC 上的 Qt5.11.2、QSqlDatabase 和 MariaDB

您可以在 C 语言的 switch 语句中的 case 中使用 while 循环吗?

c++ - (C++) 错误 : invalid use of non-static member function ‘int Demo::addTwoNumbers(int, int)’

python - 如何找到所有可能的方法将字符串划分为 n 个切片而无需递归?

java - 迭代集合的数组列表

c++ - Visual Studio 2015 “non-standard syntax; use ' &' to create pointer for member”

c++ const 指向指针的指针

c - 在 C 中使用指针通过引用修改数组

c++ - 尽管包含 header ,但g++链接器无法找到函数

c++ - 内存屏障会驯服微软的优化器吗?