字符串终止符的C++数组



我是C++的新手,我知道字符数组/char*(C-string(以Null字节结束,但字符串数组/char**也一样吗?

我的主要问题是:我如何知道我是否到达了char**变量的末尾?以下代码是否有效?

#include <cstddef>
char** myArray={"Hello", "World"};
for(char** str = myArray; *str != NULL; str++) {
//do Something
}

对于初学者来说,这个声明

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
}

或者,您可以使用C++17标准中引入的标准函数std::size来代替带有sizeof运算符的表达式。

否则,如果数组像一样声明,则初始循环将是正确的

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

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

您需要终止它:

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

因为您应该在C++中使用nullptr,而不是用于C代码的NULL

此外,使用std::vectorstd::string而不是这个烂摊子:

std::vector<std::string> myArray = { "Hello", "World" };
for (auto&& str : myArray) {
// ... str is your string reference
} 

相关内容

  • 没有找到相关文章

最新更新