C++ 字符串数组终止符
C++ array of strings terminator
我是 C++ 的新手,我知道字符 arrays/char*(c-strings) 以 Null 字节结尾,但字符串 arrays/char** 是否相同?
我的主要问题是:我怎么知道我是否到达了 char** 变量的末尾?以下代码是否有效?
#include <cstddef>
char** myArray={"Hello", "World"};
for(char** str = myArray; *str != NULL; str++) {
//do Something
}
您需要终止它:
const char** myArray={"Hello", "World", nullptr};
因为你应该在 C++ 中使用 nullptr
,而不是用于 C 代码的 NULL
。
另外,使用std::vector
和std::string
来代替这个乱七八糟的东西:
std::vector<std::string> myArray = { "Hello", "World" };
for (auto&& str : myArray) {
// ... str is your string reference
}
对于初学者这个声明
char** myArray={"Hello", "World"};
没有意义,您不能使用包含多个表达式的花括号列表来初始化标量对象。
你的意思好像是声明一个数组
const char* myArray[] ={ "Hello", "World"};
在这种情况下,for 循环看起来像
for( const char** str = myArray; *str != NULL; str++) {
//do Something
}
但数组中没有标记值的元素。所以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 };
在这种情况下,第三个元素将满足循环条件。
我是 C++ 的新手,我知道字符 arrays/char*(c-strings) 以 Null 字节结尾,但字符串 arrays/char** 是否相同?
我的主要问题是:我怎么知道我是否到达了 char** 变量的末尾?以下代码是否有效?
#include <cstddef>
char** myArray={"Hello", "World"};
for(char** str = myArray; *str != NULL; str++) {
//do Something
}
您需要终止它:
const char** myArray={"Hello", "World", nullptr};
因为你应该在 C++ 中使用 nullptr
,而不是用于 C 代码的 NULL
。
另外,使用std::vector
和std::string
来代替这个乱七八糟的东西:
std::vector<std::string> myArray = { "Hello", "World" };
for (auto&& str : myArray) {
// ... str is your string reference
}
对于初学者这个声明
char** myArray={"Hello", "World"};
没有意义,您不能使用包含多个表达式的花括号列表来初始化标量对象。
你的意思好像是声明一个数组
const char* myArray[] ={ "Hello", "World"};
在这种情况下,for 循环看起来像
for( const char** str = myArray; *str != NULL; str++) {
//do Something
}
但数组中没有标记值的元素。所以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 };
在这种情况下,第三个元素将满足循环条件。