8

如何对未明确定义的字符串数组中的字符串数求和?

string str[] = { "astring", "bstring", "cstring", "dstring", "zstring" };

需要找出数组有多少元素?

4

5 回答 5

10
template< typename T, size_t N >
/*constexpr*/ size_t size( T(&arr)[N]) )
{
   return N;
}

constexpr如果可用(C++11)将允许您将静态(编译时)使用的返回值用作另一个数组的大小。

于 2012-10-24T12:04:45.800 回答
8

如果str[]是静态定义的(如图所示),那么这将起作用:

const size_t numElements = sizeof(str) / sizeof(str[0]);

如果它是动态创建的,那么您将需要一个标记来指示最后一个元素(0如果它是一个指针数组,则通常使用它)。那个或调用者告诉你有多少元素(也很常见)。

于 2012-10-24T12:03:47.047 回答
3

除了其他答案中已经列出的方法之外,另一种方法可能是在数组的末尾添加一个保护值,例如一个空字符串。然后,您可以遍历数组,直到达到保护值。

就个人而言,我可能会使用 C++11 和

std::vector<std::string> la = { "foo", "bar", "baz" };

所以你可以查询la.size()得到你想要的东西......无论如何,在运行时。不幸的是,我没有看到使用这个技巧的方法std::array,所以它不是一个完美的选择。

于 2012-10-24T12:11:30.837 回答
1

使用指针计算数组元素的一种方法:

#include <iostream>
using namespace std;

int main() {
    string str[] = { "astring", "bstring", "cstring", "dstring", "zstring" };
    cout << ((&str)[1] - str);  // 5
    cout << endl;
    return 0;
}

输出:
5

于 2016-06-26T03:53:09.707 回答
0

我通常使用单独的变量来跟踪数组大小。

String str[] = { "astring", "bstring", "cstring", "dstring", "zstring" };
int strNum = 5;

然后,如果我需要引用任何字符串,我可以这样称呼它:

String foo = str[strNum-1];

每当我在循环中更新数组时,我只需使用 strNum 作为开始写入新字符串的索引,然后在每个新字符串之后立即在循环中放置一个 strNum++。

于 2016-06-26T03:13:19.700 回答