Finden Sie die Anzahl der Strings in einem Array von Strings in C

Lesezeit: 8 Minuten

Benutzeravatar von user1128265
Benutzer1128265

char* names[]={"A", "B", "C"};

Gibt es eine Möglichkeit, die Anzahl der Zeichenfolgen im Array zu ermitteln? In diesem Fall sollte beispielsweise Folgendes ausgegeben werden: 3.

  • Dies ist ein spezieller Fall, wie man die Größe eines Arrays erhält, das hier bereits eine allgemeine Antwort hat: stackoverflow.com/questions/37538/… Dh ein Duplikat.

    – Dies

    15. Oktober 2015 um 13:10 Uhr


In diesem Fall können Sie die Gesamtgröße durch die Größe des ersten Elements teilen:

num = sizeof(names) / sizeof(names[0]);

Aber Vorsicht, das funktioniert mit Arrays. Mit Zeigern geht das nicht.

  • Viele Codebasen definieren dies als Makro in etwa so: #define ARRAY_SIZE(x) ( sizeof(x) / sizeof((x)[0]) )

    – Matt Freiheit

    14. Oktober 2015 um 20:35 Uhr


  • Diese Antwort sollte die akzeptierte Antwort sein. Das war die erste Antwort, und sie ist richtig. Das gesagt, Die Prämie Ich vergebe die erste Antwort, die erklärt, warum dies funktioniert.

    – dotancohen

    21. Oktober 2015 um 15:41 Uhr

  • Ich habe es mit sizeof mit meinem Array-Array versucht[]={“.A.”,”..B”,”.C.”,”.D.”,”..E”,} Ich bekomme Zählung 3 von 5 ….. mit sizeof UND strlen

    Benutzer3402040

    15. März 2017 um 13:58 Uhr

  • Ich bekomme: ungültige Anwendung von „sizeof“ auf unvollständigen Typ „const char *[]’

    – Phil

    29. Juli 2020 um 12:13 Uhr

Benutzeravatar von dbush
dbusch

Für ein Array, was die Beispiele im Bounty tun sizeof(names)/sizeof(names[0]) reicht aus, um die Länge des Arrays zu bestimmen.

Dass die Strings in den Beispielen unterschiedlich lang sind, spielt dabei keine Rolle. names ist ein Array von char *also ist die Gesamtgröße des Arrays in Bytes die Anzahl der Elemente im Array multipliziert mit der Größe jedes Elements (dh a char *). Jeder dieser Zeiger könnte auf eine Zeichenfolge beliebiger Länge oder auf NULL zeigen. Egal.

Testprogramm:

#include<stdio.h>

int main(void)
{
    char* names1[]={"A", "B", "C"}; // Three elements
    char* names2[]={"A", "", "C"}; // Three elements
    char* names3[]={"", "A", "C", ""}; // Four elements
    char* names4[]={"John", "Paul", "George", "Ringo"}; // Four elements
    char* names5[]={"", "B", NULL, NULL, "E"}; // Five elements

    printf("len 1 = %zu\n",sizeof(names1)/sizeof(names1[0]));
    printf("len 2 = %zu\n",sizeof(names2)/sizeof(names2[0]));
    printf("len 3 = %zu\n",sizeof(names3)/sizeof(names3[0]));
    printf("len 4 = %zu\n",sizeof(names4)/sizeof(names4[0]));
    printf("len 5 = %zu\n",sizeof(names5)/sizeof(names5[0]));
}

Ausgabe:

len 1 = 3
len 2 = 3
len 3 = 4
len 4 = 4
len 5 = 5

BEARBEITEN:

Zur Verdeutlichung funktioniert dies nur, wenn Sie ein Array definiert haben, dh char *names[] oder char names[][], und Sie befinden sich in dem Bereich, in dem das Array definiert wurde. Wenn es definiert ist als char **names Dann haben Sie einen Zeiger, der als Array fungiert, und die obige Technik funktioniert nicht. Ebenso wenn char *names[] ein Funktionsparameter ist, in diesem Fall zerfällt das Array auf die Adresse des ersten Elements.

  • Vielen Dank. Die Erklärung, die Sie geben, ist ausgezeichnet, und sie ist der Schlüssel. Ich nehme an, basierend auf der Erklärung, dass die Antwort des cnicutar die sein sollte akzeptierte Antwort, da es die gleiche Antwort gibt, aber ohne Erklärung, aber diese Antwort ist bisher der führende Kandidat für das Kopfgeld. Vielen Dank.

    – dotancohen

    14. Oktober 2015 um 16:08 Uhr

  • Was passiert, wenn das Array leer ist?

    – Nils

    10. Juli 2018 um 7:51 Uhr

  • @Niels-Arrays mit 0-Elementen sind vom Standard nicht erlaubt.

    – dbusch

    10. Juli 2018 um 10:41 Uhr

Benutzeravatar von Richard J. Ross III
Richard J. Ross III

Es hängt davon ab, wie Ihr Array erstellt wird. In C gibt es keine Möglichkeit, die Länge eines Arrays zu überprüfen, das ein Zeiger ist, es sei denn, es hat ein Sentinel-Element oder eine Ganzzahl, die mit dem Array als Anzahl der Elemente im Array übergeben wird. In Ihrem Fall könnten Sie dies verwenden:

int namesLen = sizeof(names) / sizeof(char);

Wenn Ihr Array jedoch ein Zeiger ist,

char **names = { "A", "B", "C" };

Sie können entweder eine ganze Zahl haben, die für die Länge des Arrays konstant ist:

int namesLen = 3;

Oder fügen Sie einen Sentinel-Wert hinzu (z. B. NULL)

char **names = { "A", "B", "C", NULL };

int namesLen = -1;
while (names[++namesLen] != NULL) { /* do nothing */}

// namesLen is now the length of your array

Als andere Möglichkeit könnten Sie eine Struktur erstellen, die mit den gewünschten Werten gefüllt ist:

struct Array {
    void **values;
    int length;
};

#define array(elements...) ({ void *values[] = { elements }; array_make(values, sizeof(values) / sizeof(void *)); })
#define destroy(arr) ({ free(arr.values); })

struct Array array_make(void **elements, int count)
{
    struct Array ret;
    ret.values = malloc(sizeof(void *) * count);
    ret.length = count;

    for (int i = 0; i < count; i++) {
        ret.values[i] = elements[i];
    }

    return ret;
}

Und Sie würden es so verwenden:

struct Array myArray = array("Hi", "There", "This", "Is", "A", "Test");
// use myArray

printf("%i", myArray.length);
destroy(myArray);

  • Sie sollten durch sizeof(char *) oder sizeof(*names) dividieren, nicht durch sizeof(char)

    –Ryan H.

    7. Oktober 2018 um 15:12 Uhr

Benutzeravatar von Hassan Arafat
Hassan Arafat

Was Sie hier definieren, ist nicht buchstäblich ein Array von Zeichenfolgen, sondern ein Array von Zeigern auf Zeichen. wenn du die anzahl der strings wissen willst, musst du einfach die zeiger zählen, also sowas wie

size_t size = sizeof(names)/sizeof(char*);

tun würde, teilen Sie auf diese Weise die Größe des Arrays durch die Größe eines einzelnen Zeigers. Beachten Sie jedoch, dass dies nur funktioniert, wenn die Größe des Arrays zur Kompilierzeit bekannt ist (dh das Array wird statisch zugewiesen), wenn dies der Fall ist dann dynamisch definiert (dh char** Strings). sizeof(strings) würde die Größe des Zeigers zurückgeben, nicht das Array.

ps: Die Länge der Strings ist nicht relevant, da das Array nicht einmal “bewusst” ist, worauf die Zeiger zeigen.

Benutzeravatar von Michi
Michi

Gibt es eine Möglichkeit, die Anzahl der Zeichenfolgen im Array zu ermitteln?

Natürlich gibt es das, versuchen Sie Folgendes:

#include<stdio.h>

int main(void){
    size_t size, i=0;
    int count=0;
    char* names[]={"A", "B", "C"};

    size = sizeof(names)/sizeof(char*);

    for(i=0;i<size;i++){
        printf("%d - %s\n",count+1, *(names+i));
        count++;
    }

    printf("\n");
    printf("The number of strings found are %d\n",count);
    return 0;
}
1 - A
2 - B
3 - C
The number of strings found are 3

Das gleiche mit:

#include<stdio.h>

int main(void){
    size_t size, i=0;
    int count=0;
    char *names[]={"Jimmy", "Tom", "Michael", "Maria", "Sandra", "Madonna"};

    size = sizeof(names)/sizeof(char*);

    for(i=0;i<size;i++){
        printf("%d - %s\n",count+1, *(names+i));
        count++;
    }

    printf("\n");
    printf("The number of strings found are %d\n",count);
    return 0;
}

Ausgabe:

1 - Jimmy
2 - Tom
3 - Michael
4 - Maria
5 - Sandra
6 - Madonna
The number of strings found are 6

Oder verwenden Sie eine Funktion wie diese:

#include<stdio.h>

size_t arrLength(size_t len, char **arr){
    size_t i=0;
    size_t count=0;

    for(i=0;i<len;i++){
        printf("%zu - %s\n",count+1, *(arr+i));
        count++;
    }

    return count;
}

int main(void){
    char *names[]={"Jimmy", "Tom", "Michael", "Maria", "Sandra", "Madonna"};
    size_t length,size;

    size = sizeof(names)/sizeof(char*);
    length = arrLength(size, names);

    printf("\n");
    printf("The number of strings found are %zu\n",length);
    return 0;
}

Ausgabe:

1 - Jimmy
2 - Tom
3 - Michael
4 - Maria
5 - Sandra
6 - Madonna
The number of strings found are 6

Benutzeravatar von Marlon
Marlon

int count = sizeof(names)/sizeof(*names);

Dies nimmt die Gesamtgröße von names und teilt es durch die Größe eines Elements in namesergibt 3.

Ein einfacher Weg gibt die Zahl oder die Zeichenfolgen in einem Array zurück ist, über das Array zu iterieren, bis Ihnen die Strings ausgehen. Hier ist ein Beispiel.

#include <stdio.h>

int main()
{
    char* names[] = {"John", "Paul", "George", "Ringo", '\0'};

    int size = 0;
    while(names[++size]!='\0');

    printf("Size: %d\n", size); // Prints "4"

    return 0;
}

Diese Methode hat den Vorteil, dass sie funktioniert auch wenn die Saiten unterschiedlich lang sind. Beachten Sie das abschließende NULL-Byte in der names Array und die ; Zeichen zum Schließen while -Anweisung, da kein auszuführender Anweisungstext vorhanden ist.

  • Würde dies nur gut funktionieren, wenn das letzte Element Ihrer * Namen eine NULL wäre[] Array und wenn Sie mit einer NULL in der While-Schleife vergleichen? Andernfalls verlassen Sie sich darauf, dass der Speicher, in dem Ihre Zeichenfolgen gespeichert sind, auf Null gesetzt wird, was nicht immer der Fall ist! Der obige Code ist daher nicht sehr sicher oder zuverlässig.

    – Mike

    14. Oktober 2015 um 8:30 Uhr

  • Um das oben Gesagte hinzuzufügen, ist mein Verständnis, dass Sie im obigen Code ein Array von Zeigern auf Zeichenfolgen speichern. Dieses Array hat derzeit 4 Elemente (dh 4 Zeiger auf Ihre Zeichenfolgen). Jede Zeichenfolge ist nullterminiert, aber Ihr Array von Zeigern hat standardmäßig keinen Terminierungsdatensatz – Sie müssen ihn manuell festlegen, und NULL ist ein guter Kandidat als letzter Datensatz. Auf diese Weise können Sie es leicht in Ihrem erkennen while Schleife, durch Vergleichen gegen NULL. Ich hoffe, meine Erklärung ist klar und mein Verständnis richtig.

    – Mike

    14. Oktober 2015 um 8:43 Uhr

  • @mike: Sie haben Recht und ich habe den Code bearbeitet, um Ihre Beobachtung zu berücksichtigen. Vielen Dank.

    – dotancohen

    14. Oktober 2015 um 13:45 Uhr

  • Der letzte Eintrag als '\0'während Korrekt ist im Prinzip semantisch nicht eindeutig. Das Letzte '\0' steht für eine Nullzeigerkonstante – ist besser zu verwenden NULL oder 0 dort.

    – Antti Haapala – Слава Україні

    23. März 2019 um 15:32 Uhr

  • Das ist immer noch falsch. Hast du überhaupt versucht, es zu kompilieren? Sie können eine Zeichenkonstante wie nicht vergleichen '\0' mit einem Zeiger auf ein Zeichen.

    – jtchitty

    18. Mai 2021 um 3:57 Uhr

1402650cookie-checkFinden Sie die Anzahl der Strings in einem Array von Strings in C

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

Privacy policy