web-dev-qa-db-ger.com

Ermitteln der Größe eines String-Arrays in C++

Ich habe also ein Array von Strings. Hier ist ein Beispiel:

string array[] = {"Example", "Example2", "Example3"};

Gibt es eine Möglichkeit, die Anzahl der Elemente in einem Array wie dem obigen zu finden. Ich kann diese Methode nicht verwenden:

int numberofelements = sizeof(array)/sizeof(array[0]);

Dies liegt daran, dass die Größe der Elemente variiert. Gibt es eine andere Art und Weise?

19
turnt

Wenn Sie Ihr String-Array verwenden, können Sie mit sizeof(array)/sizeof(array[0]) sicherlich seine Größe ermitteln, und das folgende Programm funktioniert einwandfrei:

int main()
{
    std::string array[] = { "S1", "S2", "S3" };
    std::cout << "A number of elements in array is: "
              << sizeof(array)/sizeof(array[0]) << '\n';
    foo(array);
}

Es ist nicht klar, was Sie meinen, wenn Sie sagen, dass die Größe der Elemente unterschiedlich ist. Die Größe der Elemente eines Arrays ist immer zur Compiler-Zeit bekannt, keine Ausnahmen.

Es gibt jedoch Situationen, in denen dies nicht funktioniert. Betrachten Sie das folgende Beispiel:

void foo(std::string array[])
{
    std::cout << "A number of elements in array is: "
              << sizeof(array)/sizeof(array[0]) << '\n';
}

Der obige Code ist zum Scheitern verurteilt. Es mag auf den ersten Blick ein bisschen komisch aussehen, aber der Grund dafür ist eigentlich sehr einfach - dies wird als Array Decaying bezeichnet. Das bedeutet, dass jedes Mal, wenn Sie ein Array an eine Funktion übergeben, der Typ automatisch auf den eines Zeigers reduziert wird. Die obige Funktion entspricht also tatsächlich:

void foo(std::string *array)
{
}

Und wenn im ersten Beispiel der Operator sizeof die Gesamtgröße eines Arrays zurückgibt, gibt er im zweiten Beispiel die Größe eines Zeigers auf dieses Array zurück, was völlig anders ist.

Es gibt normalerweise zwei Wege, auf die die Leute vorgehen. Die erste besteht darin, ein spezielles "letztes" Element des Arrays hinzuzufügen, damit die Anwendung das Array bis zum letzten Element durchlaufen und die Länge des Arrays berechnen kann. String-Literale sind das perfekte Beispiel dafür - jedes String-Literal endet mit '\ 0' und Sie können seine Länge jederzeit berechnen. Hier ist ein Beispiel:

static void foo(const std::string *array)
{
    size_t i = 0;
    while (!array[i].empty())
        ++i;
    std::cout << "Array length is: " << i << std::endl;
}

Der Nachteil ist natürlich die Notwendigkeit, das Array zu durchlaufen, um seine Länge zu bestimmen. Der zweite Weg, um die Arraylänge immer herumzutragen, zum Beispiel:

static void foo(const std::string *array, size_t length)
{
    // ...
}

void bar()
{
    std::string array[] = { "S1", "S2", "S3" };
    foo(array, sizeof(array)/sizeof(array[0]));
}

In C++ können Sie eine Vorlage verwenden, um die Länge des Arrays abzuziehen, zum Beispiel:

template <size_t array_length>
static void foo(const std::string (&array)[array_length])
{
    std::cout << "A number of elements in template array is: "
              << array_length << '\n';
}

Alle oben genannten Punkte gelten für einfache Arrays, die in die Sprache integriert sind. Auf der anderen Seite bietet C++ einen umfangreichen Satz von übergeordneten Containern, die Ihnen viel Flexibilität bieten. Daher möchten Sie vielleicht erwägen, einen der Container zu verwenden, die Ihnen als Teil der C++ - Standardbibliothek zur Verfügung stehen. Eine Liste der Standardcontainer finden Sie unter - http://en.cppreference.com/w/cpp/container

Ich hoffe es hilft. Viel Glück!

29
user405725

Sie können eine Vorlagenfunktion verwenden, um dies zu erreichen:

#include<cstdlib>

template<class T, std::size_t n>
constexpr std::size_t size(T (&)[n])
{ return n; }

Und wie Luchian Grigore sagte, sollten Sie STL-Container verwenden. std :: array, wenn Sie einem statischen C-Array entsprechen möchten.

7

Sie können immer noch verwenden 

int numberofelements = sizeof(array)/sizeof(array[0]);

Dies liegt daran, dass sizeof(array) die Summe der Größen der Zeiger zurückgibt, die jeder Zeichenfolge entsprechen. sizeof(array[0]) gibt die Größe des Zeigers zurück, der der ersten Zeichenfolge entspricht. Somit gibt sizeof(array)/sizeof(array[0]) die Anzahl der Zeichenfolgen zurück.

2
deerishi

In stdlib library gibt es eine Standardfunktion:

#include <stdlib.h>
static const char * const strings[] = {"str1", "str2", "str3"};
const int stringCount = _countof(strings);
2
vitperov

Wir können die Anzahl der Elemente eines Arrays ermitteln, indem Sie einfach die Funktion size() verwenden.

Beispielcode:

string exampleArray[] = { "Example", "Example2", "Example3" };
    int size_of_array = size(exampleArray);

cout << "Number of elements in array = " << size_of_array << endl;

Ausgabe:

>>> Number of elements in array = 3

Ich hoffe es hilft dir.

1
Arslan Ahmad

Ist es das, wonach du suchst?

string array[] = {"Example", "Example2", "Example3"};
int num_chars = 0;
int num_strings = sizeof(array)/sizeof(array[0]);
for (int i = 0; i < num_strings; i++) {
    num_chars += array[i].size();
}
0
Mr Fooz

Obligatorische Hinweise: Verwenden Sie std::vector<std::string>.

Eine Funktion wie diese kann helfen:

template<typename T, int sz>
int getSize(T (&) [sz])
{
    return sz;
}

Ihre Methode funktioniert auch, weil die Größe der Elemente nicht variiert. Ein std::string hat eine konstante Größe, unabhängig von der tatsächlichen Zeichenfolge.

0
Luchian Grigore
string s[] = {"Apple","banana","cherry","berry","kiwi"};
int size = *(&s+1)-s;  
// OR
int size = sizeof(s)/sizeof(s[0]);

weitere Informationen zum ersten: https://aticleworld.com/how-to-find-sizeof-array-in-cc-without-using-sizeof/

0
Pygirl

Hier ist ein anderes Beispiel: 

string array[] = {"Example", "Example2", "Example3"};
int numberofelements = 0; for(auto c: array) { numberofelements++; };
// now numberofelements will contain 3
0
serup