C++ 使用指针写入数组元素时出现问题
第一个循环是完美的。第二个不起作用。 “Z”有什么问题。 为什么循环不停止? 当我在表中给出“Z”时,循环不起作用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'是数组的最后一个元素。在(应该)最后一次迭代结束
#包括
使用名称空间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
的条件部分,或者将其留空,这会产生相同的结果。在您的代码中,您将初始化部分和增量部分留空,然后在代码中增加两行来执行此操作,这似乎很奇怪。例如codeint 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
的条件部分,或者将其留空,这会产生相同的结果。在您的代码中,您将初始化部分和增量部分留空,然后在代码中增加两行来执行此操作,这似乎很奇怪。例如codeint 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