sizeof(array)/sizeof(element) 适用于定长数组的定长数组(不是指针)。作为字符串数组,我们最常使用指向各种(固定)长度字符串的指针(固定长度)数组,因此这个技巧不起作用。sizeof() 用于在编译时知道大小的对象。它不适用于动态分配的数据本身。
当对象包含指针时,例如字符串数组,sizeof() 返回最高级别(固定大小)结构的大小。通常它只是单个指针的大小。它不包括指针指向的已分配数据的大小。因为该数据实际上不是主要对象的一部分,它确实是一个或多个单独的对象(我们在这里有聚合而不是组合,请参阅http://en.wikipedia.org/wiki/Object_composition)。
在 C++ 中,使用向量非常方便满足您的需求。也可以使用其他合适的标准容器。length() 和 size() 方法是同义词,请参见http://www.cplusplus.com/reference/string/string/size/ )
PS 请注意,对于 std::string s 对象 sizeof(s) 是一个常数,与 s.length() 返回的实际(可变)字符串长度无关。实际分配的内存大小由 s.capacity() 返回,并且可能大于 length()。
使用向量数组的示例:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string s = "01234";
cout << "s[" << s.length() << "]=\"" << s << "\"" << endl;
cout << "sizeof(s)=" << sizeof(s) << " (implementation dependent)" << endl;
cout << endl;
s += "56789012345";
cout << "s[" << s.length() << "]=\"" << s << "\"" << endl;
cout << "sizeof(s)=" << sizeof(s) << " (implementation dependent)" << endl;
cout << endl;
vector<string>vs={"12","23","345","456","567","67888","7899999999","8","9876543210"};
cout << "vs[" << vs.size() << "]={";
size_t sz=0;
for (size_t index=0; index<vs.size(); index++)
{
sz+=vs[index].size();
if (index>0)
cout << ",";
cout << "\"" << vs[index] << "\":" << vs[index].size();
}
cout << "}:" << sz << endl;
cout << "sizeof(vs)=" << sizeof(vs) << " (implementation dependent)" << endl;
return 0;
}
结果:
s[5]="01234"
sizeof(s)=8 (implementation dependent)
s[16]="0123456789012345"
sizeof(s)=8 (implementation dependent)
vs[9]={"12":2,"23":2,"345":3,"456":3,"567":3,"67888":5,"7899999999":10,"8":1,"9876543210":10}:39
sizeof(vs)=24 (implementation dependent)