sizeof (массив) / sizeof (элемент) работает для массивов фиксированной длины массивов фиксированной длины (не указателей).
В качестве массива строк мы чаще всего используем (фиксированной длины) массив строк указателей на различные (фиксированные) длины, поэтому этот трюк не сработает.
sizeof () используется для объектов, размер которых известен во время компиляции. Это не относится к динамически размещаемым данным.
Когда объект содержит указатели, как в случае массива строк,
sizeof () возвращает размер структуры самого высокого уровня (фиксированного размера). Часто это просто размер одного указателя. Он не включает размер выделенных данных, на которые указывают указатели. Поскольку эти данные на самом деле не являются частью основного объекта, это действительно один или несколько отдельных объектов (здесь мы имеем агрегацию вместо композиции, см. http://en.wikipedia.org/wiki/Object_composition).
В C ++ использование векторов очень удобно для ваших нужд. Можно использовать и другие подходящие стандартные контейнеры.
Методы length () и size () являются синонимами, см. http://www.cplusplus.com/reference/string/string/size/)
P.S. Обратите внимание, что для 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)