Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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++的新手,我知道字符数组/字符(C字符串)以null字节结尾,但是对于字符串数组/字符**/p>是否相同?_C++_Arrays_Null_C Strings_String Literals - Fatal编程技术网

C++;字符串数组终止符 我是C++的新手,我知道字符数组/字符(C字符串)以null字节结尾,但是对于字符串数组/字符**/p>是否相同?

C++;字符串数组终止符 我是C++的新手,我知道字符数组/字符(C字符串)以null字节结尾,但是对于字符串数组/字符**/p>是否相同?,c++,arrays,null,c-strings,string-literals,C++,Arrays,Null,C Strings,String Literals,我的主要问题是:如何知道我是否到达了char**变量的末尾?下面的代码可以工作吗 #include <cstddef> char** myArray={"Hello", "World"}; for(char** str = myArray; *str != NULL; str++) { //do Something } #包括 字符**myArray={“你好”,“世界”}; for(char**str=myArray;*str!=N

我的主要问题是:如何知道我是否到达了char**变量的末尾?下面的代码可以工作吗

#include <cstddef>

char** myArray={"Hello", "World"};

for(char** str = myArray; *str != NULL; str++) {
  //do Something
}
#包括
字符**myArray={“你好”,“世界”};
for(char**str=myArray;*str!=NULL;str++){
//做点什么
}

您需要终止它:

const char** myArray={"Hello", "World", nullptr};
< >在C++中,你应该使用<代码> null pTr>代码>,而不是<代码> null <代码>,这是C代码。< /P> 此外,使用
std::vector
std::string
而不是这个混乱:

std::vector myArray={“你好”,“世界”};
用于(自动(&str:myArray){
//…str是您的字符串引用
} 

首先,请阅读此声明

char** myArray={"Hello", "World"};
没有意义,您不能使用带大括号的列表和多个表达式初始化标量对象

您的意思似乎是数组的声明

const char* myArray[] ={ "Hello", "World"};
在这种情况下,for循环可以如下所示

for( const char** str = myArray; *str != NULL; str++) {
  //do Something
}
但是数组没有具有sentinel值的元素。所以这个条件在for循环中

*str != NULL
导致未定义的行为

您可以重写循环,例如

for( const char** str = myArray; str != myArray + sizeof( myArray ) / sizeof( *myArray ); str++) {
  //do Something
}
<>或代替使用<代码> sieOfs< /Cux>运算符,可以使用C++ 17标准中引入的标准函数<代码> STD::Stime。 否则,如果数组声明为

const char* myArray[] ={ "Hello", "World", nullptr };

在这种情况下,第三个元素将满足循环的条件。

std::array
std::vector
更适合于此,为什么?这是一种学术上的区别。99%的时间
std::vector
完全没有问题。这不是性能关键代码,也没有达到任何内存限制。大小是编译时常量
std::vector
增加了动态分配和大小可变性。它与使用常量引用参数避免复制相比,不会更过早地进行优化。这是使用工具的工作,它是专为<代码>std::数组更好地表达了意图。在“引用”中有很多东西没有反映我所说的任何话,或是提议说的话。我不认为std::vector在这里是错误的,因此我没有投反对票。但是
std::array
是一个简单的改进,我本以为这不会引起争议。我同意限制初学者应该接触的容器数量可能是最好的,但是
std::array
看起来并不复杂或神秘,初学者应该避免接触。但这是你的答案,使用你想要的。谢谢你的答案,sizeof或std::size在函数中工作吗?我听说在函数中传递变量时,sizeof不起作用,对吗?@PTorPro如果通过引用传递数组,它就会起作用。否则,数组指示符将转换为指向其第一个元素的指针。在这种情况下,还需要传递数组中的元素数。或者使用sentinel值nullptr追加数组。正如已经指出的那样。