Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用指针写入数组元素时出现问题_C++_Loops_Pointers_While Loop_Do While - Fatal编程技术网

C++ 使用指针写入数组元素时出现问题

C++ 使用指针写入数组元素时出现问题,c++,loops,pointers,while-loop,do-while,C++,Loops,Pointers,While Loop,Do While,第一个循环是完美的。第二个不起作用。 “Z”有什么问题。 为什么循环不停止? 当我在表中给出“Z”时,循环不起作用 #包括 使用名称空间std; int main() { 字符制表符[]{'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; 而(*wsk'Z'是数组的最后一个元素。在(应该)最后一次迭代结束

第一个循环是完美的。第二个不起作用。 “Z”有什么问题。 为什么循环不停止? 当我在表中给出“Z”时,循环不起作用

#包括
使用名称空间std;
int main()
{
字符制表符[]{'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;

而(*wsk
'Z'
是数组的最后一个元素。在(应该)最后一次迭代结束时,
wsk
增加到数组最后一个元素之外。在下一次迭代中,
*wsk
'Z'
是数组的最后一个元素。在(应该)结束时上一次迭代中,
wsk
的增量超过数组的最后一个元素。在下一次迭代中,
*wsk在输出
'Z'
后,您可以增量
wsk
,使其指向数组的末尾。然后在(*wsk在输出
'Z'
后,您增加
wsk
,使其指向数组的末尾。然后它到达
,而(*wsk这是未定义的行为

while(*wsk <= 'Z')

请注意,如果数组中的字符都是
这是未定义行为,那么这也将防止第一个循环导致未定义行为

while(*wsk <= 'Z')

请注意,如果数组中的字符都是
使用
向量
范围
for loop:

#include <iostream>
#include<vector>
using namespace std;

int main()
{
    vector<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', 0};


    for(auto it:tab){
        cout<<it<<" ";
        if(it>'Z')
            break;
        }
    cout << endl;
}
#包括
#包括
使用名称空间std;
int main()
{
向量表={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”,0};
用于(自动it:选项卡){

cout使用
向量
范围
进行循环:

#include <iostream>
#include<vector>
using namespace std;

int main()
{
    vector<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', 0};


    for(auto it:tab){
        cout<<it<<" ";
        if(it>'Z')
            break;
        }
    cout << endl;
}
#包括
#包括
使用名称空间std;
int main()
{
向量表={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”,0};
用于(自动it:选项卡){

cout像往常一样,问题是您选择了一个错误的循环。:)

因此,在循环中,您将在数组之外继续迭代

这种情况

*wsk <= 'Z'
在数组的最后一个元素之后访问内存

使用
do while循环

这是一个演示程序

#include <iostream>

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

    for ( char c : tab )
    {
        const char *wsk = tab;

        do
        {
            std::cout << *wsk << " ";
        } while ( *wsk++ != c );

        std::cout << '\n';
    }       

    return 0;
}

与往常一样,问题是您选择了一个错误的循环。:)

因此,在循环中,您将在数组之外继续迭代

这种情况

*wsk <= 'Z'
在数组的最后一个元素之后访问内存

使用
do while循环

这是一个演示程序

#include <iostream>

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

    for ( char c : tab )
    {
        const char *wsk = tab;

        do
        {
            std::cout << *wsk << " ";
        } while ( *wsk++ != c );

        std::cout << '\n';
    }       

    return 0;
}


通常你会在列表末尾添加一个<代码> 0代码>作为终止符,而不是任意的<代码> 'z '/COD>。C++也可以使用<代码> STD::vector 或 STD::数组< /COD>和正则迭代器,不需要C样式数组。我不是指解决方案,而是意识到我将离开范围。DE>0/代码>作为终止符,不是任意的<代码> 'Z' < /代码>。也可以使用<代码> STD::“代码< /COD>”或“代码> STD::数组< /COD>和正则迭代器,不需要C++样式数组。我不是指解决方案,而是意识到我将离开范围>选项卡>代码> WSK!=结束< /COD> = = >代码> WSK!=结束和&*wsk@WhozCraig可能;取决于OP的意图。同意。意图在原始
中很清楚,而
条件为afaic。
wsk!=end
=>
wsk!=end&&*wsk@WhozCraig可能;取决于OP的意图。同意。意图在原始
中很清楚,而
条件为afaic。然后
 对于(wsk=tab;true;++wsk)
isbetter@Slava甚至对于(wsk=tab;;++wsk)
@scohe001这是品味的问题,我发现明确地把
true
放在那里更容易理解。@Slava:如果这是品味的问题,你为什么觉得必须“纠正”我的代码?@TonyK趣味的问题是将
true
放入
for
的条件部分,或者将其留空,这会产生相同的结果。在您的代码中,您将初始化部分和增量部分留空,然后在代码中增加两行来执行此操作,这似乎很奇怪。例如code
int i=0;for(;){if(i>10)break;a[i]=0;i++;}
看起来很难看,并提出了一个问题,为什么专门为它设计的
for的部分没有被使用?然后
for(wsk=tab;true;++wsk)
被禁用了better@Slava甚至
for(wsk=tab;;++wsk)
@scohe001这是品味的问题,我发现明确地把
true
放在那里更容易理解。@Slava:如果这是品味的问题,为什么你觉得必须“纠正”我的代码?@TonyK趣味的问题是将
true
放入
for
的条件部分,或者将其留空,这会产生相同的结果。在您的代码中,您将初始化部分和增量部分留空,然后在代码中增加两行来执行此操作,这似乎很奇怪。例如code
int i=0;for(;){if(i>10)break;a[i]=0;i++;}
看起来很难看,并提出了一个问题,为什么专门为它设计的
for
的某些部分没有被使用?…你的while做的不是与
while(*wsk++!=c)完全一样的事情吗{…
?我认为这里根本不需要在打印之前执行do。唯一的区别是在打印之前而不是之后递增。@scohe001不,它们是不同的。do while循环输出所有字符,包括c。循环跳过序列b中的第一个字符
*wsk <= 'Z'
wsk++;
#include <iostream>

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

    for ( char c : tab )
    {
        const char *wsk = tab;

        do
        {
            std::cout << *wsk << " ";
        } while ( *wsk++ != c );

        std::cout << '\n';
    }       

    return 0;
}
A 
A B 
A B C 
A B C D 
A B C D E 
A B C D E F 
A B C D E F G 
A B C D E F G H 
A B C D E F G H I 
A B C D E F G H I J 
A B C D E F G H I J K 
A B C D E F G H I J K L 
A B C D E F G H I J K L M 
A B C D E F G H I J K L M N 
A B C D E F G H I J K L M N O 
A B C D E F G H I J K L M N O P 
A B C D E F G H I J K L M N O P Q 
A B C D E F G H I J K L M N O P Q R 
A B C D E F G H I J K L M N O P Q R S 
A B C D E F G H I J K L M N O P Q R S T 
A B C D E F G H I J K L M N O P Q R S T U 
A B C D E F G H I J K L M N O P Q R S T U V 
A B C D E F G H I J K L M N O P Q R S T U V W 
A B C D E F G H I J K L M N O P Q R S T U V W X 
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 
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