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

Lesezeit: 7 Minuten

Benutzer-Avatar
drehen

Also habe ich ein Array von Strings. Hier ist ein Beispiel:

std::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?

  • Die Methode, die Sie geschrieben haben, funktioniert einfach, find, numberoflemenets würde 3 enthalten. Der Grund dafür ist, dass die Größe jedes Array-Elements gleich ist, es ist die Größe einer String-Klasse (die nicht den String selbst enthält, sondern nur darauf zeigt es).

    – tohava

    13. Januar 2013 um 22:32 Uhr

  • Verwenden ein std::vectoroder ein std::array wenn Ihr Compiler es unterstützt.

    – Peter Holz

    13. Januar 2013 um 22:32 Uhr

  • Wie definieren Sie “Größe eines String-Arrays”? Welche Antwort erwarten Sie in Ihrem Beispiel?

    – Juanchopanza

    13. Januar 2013 um 22:34 Uhr

  • Meinen Sie damit, den von allen Strings verwendeten Speicher zu addieren? Also 8 + 9 + 9 Zeichen? Oder etwas anderes?

    – Peter Holz

    13. Januar 2013 um 22:35 Uhr


  • Was wäre, wenn ich C-Strings verwenden würde? Würde die Methode noch funktionieren?

    – dreh

    13. Januar 2013 um 22:57 Uhr

Angesichts Ihres Arrays von Zeichenfolgen können Sie mit Sicherheit verwenden sizeof(array)/sizeof(array[0]) um seine Größe zu erhalten, 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 variiert. Die Größe der Elemente eines Arrays ist zur Compilerzeit immer bekannt, ohne Ausnahmen.

Es gibt jedoch Situationen, in denen das oben Genannte 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 etwas seltsam 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, sein Typ automatisch in den eines Zeigers zerfällt. Die obige Funktion ist also tatsächlich ein Äquivalent dazu:

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

Und wenn im ersten Beispiel die sizeof -Operator gibt die Gesamtgröße eines Arrays zurück, im zweiten Beispiel gibt er die Größe eines Zeigers auf dieses Array zurück, was eine ganz andere Sache ist.

Normalerweise gibt es zwei Möglichkeiten, wie die Leute vorgehen. Die erste besteht darin, ein spezielles „letztes“ Element des Arrays hinzuzufügen, damit die Anwendung das Array durchlaufen kann, bis sie das letzte Element sieht, und die Länge des Arrays berechnet. String-Literale sind das perfekte Beispiel dafür – jedes String-Literal endet mit ‘\0’ und Sie können immer seine Länge 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 offensichtlich, dass das Array durchlaufen werden muss, um seine Länge zu bestimmen. Die zweite Möglichkeit besteht darin, die Array-Länge immer mit sich 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 abzuleiten, 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';
}

All dies gilt für einfache Arrays, die in die Sprache integriert sind. C++ hingegen bietet eine große Auswahl an übergeordneten Containern, die Ihnen viel Flexibilität bieten. Daher sollten Sie 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!

  • Vielen Dank! Es macht jetzt Sinn.

    – dreh

    13. Januar 2013 um 23:28 Uhr

  • @ user405725: str.empty gibt 1 zurück, wenn str = “”, also wird die Schleife in Ihrem Array-Traversal-Code vorzeitig beendet, wenn ein Element “” ist, z. B. String-Array[] = {“Beispiel”, “”, “Beispiel3”};

    – Gnubie

    20. August 2015 um 14:33 Uhr

  • @ user405725: “Es ist nicht klar, was Sie meinen, wenn Sie sagen, dass die Größe der Elemente variiert.” Ich denke, er versucht zu sagen, dass die Länge jeder Zeichenfolge im Array unterschiedlich ist. zB: {“ab”,”abc”,”abcd”} diese haben die Längen {1,2,3}

    – Chandra Shechar

    18. November 2019 um 3:13 Uhr


Sie könnten 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 ein Äquivalent zum statischen C-Array wünschen.

  • @Vlad Lazarenko: Sie bevorzugen die Standardbibliothek? Während das Handbuch von sgi STL Container enthält (also std::array), denke ich, dass STL an Container (wie std::array) angepasst ist. Aber ich denke nicht, dass die Verwendung von “STL” oder “Standardbibliothek” hier wirklich wichtig ist (ist nicht das Hauptthema, und die Verwendung des einen oder anderen stört das Verständnis nicht).

    – Florian Blanchet

    14. Januar 2013 um 0:04 Uhr

  • @FlorianBlanchet: Hier ist eine gute detaillierte Erklärung, warum es schlecht ist, den STL-Begriff zu verwirren – stackoverflow.com/a/5205571/405725

    Benutzer405725

    14. Januar 2013 um 0:11 Uhr

  • @Vlad Lazarenko: Ich weiß das, aber außer wenn es wirklich egal ist, verwende ich das eine oder andere mit der gleichen Bedeutung (ich bin in der For “STL” -Schule unseres verlinkten Beitrags). Beachten Sie, dass sogar das Komitee STL in einigen (neueren) Artikeln (nicht im Standard) verwendet. Ich bin mir ziemlich sicher, dass sie sich auf die ursprüngliche STL-Erweiterung mit einem ähnlichen Konzept von C++ 11 beziehen (dh Container, Algorithmen und Iteratoren von C++ 11). Es enthält Stepanov …

    – Florian Blanchet

    14. Januar 2013 um 0:36 Uhr


Es gibt eine Standardfunktion in stdlib Bibliothek:

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

  • Visual C++ unterstützt dieses integrierte Makro namens _countof, um ungültige Eingaben zur Kompilierungszeit zu erkennen, aber diese Lösung ist nicht Standard. Wenn Sie C ++ 11 erstellen, funktioniert dies nicht

    – serup

    22. Februar 2017 um 14:44 Uhr

Sie können immer noch verwenden

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

Das ist weil sizeof(array) gibt die Summe der Zeigergrößen zurück, die jeder Zeichenfolge entsprechen. sizeof(array[0]) gibt die Größe des Zeigers zurück, der der ersten Zeichenfolge entspricht. Daher, sizeof(array)/sizeof(array[0]) gibt die Anzahl der Strings zurück.

Benutzer-Avatar
Arslan Ahmad Khan

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

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

Hoffe es hilft dir.

  • Was ist daran falsch, können Sie den Grund nennen, bitte?

    – Arslan Ahmad Khan

    6. Juni 2017 um 19:26 Uhr

  • Was hat es mit Visual Studio zu tun? Und das ergibt auch das falsche Ergebnis, oder?

    – martijnn2008

    6. Juni 2017 um 19:38 Uhr

  • es findet die Größe des Arrays

    – Arslan Ahmad Khan

    6. Juni 2017 um 19:42 Uhr

  • @martijnn2008 es funktioniert. Ich lade einen Screenshot hoch, den Sie in der Antwort einchecken können.

    – Arslan Ahmad Khan

    6. Juni 2017 um 19:49 Uhr


  • @martijnn2008 es ist ok. Ich bin mir nicht sicher, ob es auf beiden funktioniert. Ich bin auf 64bit

    – Arslan Ahmad Khan

    6. Juni 2017 um 20:27 Uhr


Benutzer-Avatar
Herr Fuoz

Ist es das, wonach Sie suchen?

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();
}

  • Was ist daran falsch, können Sie den Grund nennen, bitte?

    – Arslan Ahmad Khan

    6. Juni 2017 um 19:26 Uhr

  • Was hat es mit Visual Studio zu tun? Und das ergibt auch das falsche Ergebnis, oder?

    – martijnn2008

    6. Juni 2017 um 19:38 Uhr

  • es findet die Größe des Arrays

    – Arslan Ahmad Khan

    6. Juni 2017 um 19:42 Uhr

  • @martijnn2008 es funktioniert. Ich lade einen Screenshot hoch, den Sie in der Antwort einchecken können.

    – Arslan Ahmad Khan

    6. Juni 2017 um 19:49 Uhr


  • @martijnn2008 es ist ok. Ich bin mir nicht sicher, ob es auf beiden funktioniert. Ich bin auf 64bit

    – Arslan Ahmad Khan

    6. Juni 2017 um 20:27 Uhr


Benutzer-Avatar
Luchian Grigore

Obligatorische Beratung: verwenden 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 – a std::string hat eine konstante Größe, unabhängig von der tatsächlichen Zeichenfolge, die sie enthält.

1353610cookie-checkErmitteln der Größe eines String-Arrays in C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy