C++ 动态数组中的数组循环终止

C++ 动态数组中的数组循环终止,c++,arrays,loops,C++,Arrays,Loops,我在练习数组中的循环,动态数组的循环不能用空字符终止吗 for (int i=0; arr[i]!='\0'; i++) 我如何在不使用此格式的情况下终止这些循环: for (const auto& value : arr) 您可以这样做: int* arr = new int[size]; for(int i=0; i< size; ++i) { //do somtiong; } 正如@john在注释范围中所写的那样,基本循环仅在STL容器上工作,并且静态创建了一个

我在练习数组中的循环,动态数组的循环不能用空字符终止吗

for (int i=0; arr[i]!='\0'; i++)
我如何在不使用此格式的情况下终止这些循环:

for (const auto& value : arr)
您可以这样做:

int* arr = new int[size];
for(int i=0; i< size; ++i)
{
    //do somtiong;
}
正如@john在注释范围中所写的那样,基本循环仅在STL容器上工作,并且静态创建了一个如下的容器:
int-arr[size]不在动态分配数组上。

您可以这样做:

int* arr = new int[size];
for(int i=0; i< size; ++i)
{
    //do somtiong;
}
正如@john在注释范围中所写的那样,基本循环仅在STL容器上工作,并且静态创建了一个如下的容器:
int-arr[size]不在动态分配阵列上。

对于在空闲存储上分配的阵列

int* arr = new int[size];
有两种方法可以知道终点在哪里。最直接的方法是记住它有多大:

for (int i = 0; i < size; ++i)
    // do something with arr[i]
这就是文字字符串的工作原理(尽管它们不是在免费存储中分配的):

最后一个元素没有您正在处理的任何数据;它只是在那里标志着结束


当然,有了哨兵,你就有可能没有选择一个好的哨兵值。如果在数据中间找到某个值,代码将停止循环,并且不会处理其余的数据。
int* arr = new int[size];
有两种方法可以知道终点在哪里。最直接的方法是记住它有多大:

for (int i = 0; i < size; ++i)
    // do something with arr[i]
这就是文字字符串的工作原理(尽管它们不是在免费存储中分配的):

最后一个元素没有您正在处理的任何数据;它只是在那里标志着结束


当然,有了哨兵,你就有可能没有选择一个好的哨兵值。如果在数据中间找到某个值,则代码将停止循环,并且不会处理其余的数据。如果有动态字符数组,则

char* str = new char[size];
没有空终止符,除非你把它放在那里

如果您知道存在空终止符,则只能依赖空终止符:

char[] str1 = "Hello world"; // null terminated by default
char* str2 = new char[16]; // enough space for copy
strcpy(str2, str1); // strcpy also copies '\0'

// now you can iterate
for(int i = 0; str2[i] != '\0'; i++)
{
    std::cout << str2[i];
}
char[]str1=“你好世界”//默认情况下以null结尾
char*str2=新字符[16];//有足够的空间复制
strcpy(str2,str1);//strcpy还复制“\0”
//现在可以迭代了
for(int i=0;str2[i]!='\0';i++)
{

std::cout如果您有一个动态字符数组:

char* str = new char[size];
没有空终止符,除非你把它放在那里

如果您知道存在空终止符,则只能依赖空终止符:

char[] str1 = "Hello world"; // null terminated by default
char* str2 = new char[16]; // enough space for copy
strcpy(str2, str1); // strcpy also copies '\0'

// now you can iterate
for(int i = 0; str2[i] != '\0'; i++)
{
    std::cout << str2[i];
}
char[]str1=“Hello world”//默认情况下以null结尾
char*str2=新字符[16];//有足够的空间进行复制
strcpy(str2,str1);//strcpy还复制“\0”
//现在可以迭代了
for(int i=0;str2[i]!='\0';i++)
{

std::cout空字符将根据应用程序的用途来工作。例如,如果给定了一个数组,并且事先知道数组中的最后一个元素是空字符,则可以使用空字符来终止循环

请注意,如果使用空字符终止,则数组不能保留值0,因为空字符的ASCII值为0,并且每当数组包含0时,循环将结束。在标准C/C++中,空字符终止用于字符串。字符串是带有空字符的字符数组,标记数组的结束


在一般情况下,使用数组时,您需要知道数组的大小。如果为您提供了一个STL容器,如
vector
,则可以使用
size()访问其大小
运算符。但是对于好的旧数组,您需要知道大小。

空字符将根据您的应用程序用途来工作。例如,如果您得到一个数组,并且您事先知道数组中的最后一个元素是空字符,那么您可以使用空字符来终止循环

请注意,如果使用空字符终止,则数组不能保留值0,因为空字符的ASCII值为0,并且每当数组包含0时,循环将结束。在标准C/C++中,空字符终止用于字符串。字符串是带有空字符的字符数组,标记数组的结束


在一般情况下,使用数组时,您需要知道数组的大小。如果为您提供了一个STL容器,如
vector
,则可以使用
size()访问其大小
运算符。但是对于好的旧数组,您需要以某种方式知道数组的大小。

您必须以某种方式知道数组的大小。没有神奇的方法可以做到这一点。加上
for(const auto&value:arr)
不适用于动态数组,原因很简单,无法从数组本身知道动态数组的大小。您必须以某种方式知道数组的大小。没有神奇的方法可以做到这一点。加上
for(const auto&value:arr)
不适用于动态数组,原因很简单,因为无法从数组本身知道动态数组的大小。我认为它们也适用于静态数组,但绝对不适用于动态数组。你说得对,我现在检查它,这对我来说是新的:)我认为它们也适用于静态数组,但绝对不适用于动态数组。y你是对的,我现在检查它对我来说是新的:)谢谢你,这不仅帮助我纠正错误,而且帮助我清楚地理解概念。谢谢你,这不仅帮助我纠正错误,而且帮助我清楚地理解概念。
char[] str1 = "Hello world"; // null terminated by default
char* str2 = new char[16]; // enough space for copy
strcpy(str2, str1); // strcpy also copies '\0'

// now you can iterate
for(int i = 0; str2[i] != '\0'; i++)
{
    std::cout << str2[i];
}
int* arr = new int[size];
for(int i = 0; i < size; i++)
{
    // do something
}