Größe eines Arrays feststellen



  • Hallo zusammen!

    Ich habe in meinem Programm ein zweidimensionales char-Array. Dabei ist die Größe der zweiten Dimension unterschiedlich.....also steht beispielsweise unter array[0] "Beispiel" und array[1] = "Hallo" oder so ähnlich.
    Kann ich die Länge des Wortes irgendwie abfragen, damit ich weiß, wie weit eine for-Schliefe laufen muss, wenn sie jeden einzelnen Buchstaben behandeln soll? Ich hatte irgendwie im Kopf, dass es sowas wie array[i].length gibt, aber das tut es bei mir nicht.

    Ich hoffe mein Problem war verständlich und es kann mir jemand helfen! 😃

    Lg, Meike



  • irgendwie im Kopf, dass es sowas wie array[i].length gibt, aber das tut es bei mir nicht

    Das gab's in Java 😉

    Mit der Funktion strlen kannst du die Länge eines char-Arrays herausfinden.



  • Ach ja...in Java 😃

    Danke schonmal. Dann probier ich's mal mit strlen.



  • Das sagt dir auch nicht wie lange das Array ist, sondern nur wieviele Zeichen vor dem '\0' stehen.

    In C/C++ hast du keine Chance die Länge eines Arrays abzufragen. Es sei denn man hat es sich in einer Variable gemerkt.
    🤡



  • Hm....also irgendwie klappt das nicht so richtig. Wenn ich mir mein Array wie in ausgeben() zu sehen, ausgeben lasse, wird immer nur der erste Buchstabe jeder Zeile ausgegeben und danach kommt eine Fehlermeldung. Kann mir doch mal eben jemand helfen? Das Programm soll den peicherplatz für jeden eingelesenen String dynamisch auf die Länge des Strings reservieren....

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void zeigerAufNullSetzen(int anzahlStrings, char ** strFeld){
    	for(int i = 0; i < anzahlStrings; i++)
    		strFeld[i] = NULL;
    }
    
    void inhaltDerElementeSetzen(int anzahlStrings, char ** strFeld){
    	string eingabe;
    	for(int i = 0; i < anzahlStrings; i++){
    		// Wort einlesen
    		cout << "Wort Nummer " << i+1 << ": ";
    		cin >> eingabe;
    
    		// Speicherplatz in Wortlänge reservieren
    		strFeld[i] = new char[eingabe.length()];
    
    		// Wort einspeichern
    		for(int k = 0; k < eingabe.length(); k++)
    			strFeld[i][k] = eingabe[k];
    	}
    }
    
    void ausgeben(int anzahlStrings, char ** strFeld){
    	for(int i = 0; i < anzahlStrings; i++){
    		for(int k = 0; k < strlen(strFeld[i]); i++)
    			cout << strFeld[i][k];
    		cout << "\n";
    	}
    }
    
    int main ()
    {
    	int anzahlStrings=5;
    	char **strFeld = new char*[anzahlStrings];
    
    	zeigerAufNullSetzen(anzahlStrings, strFeld);
    	inhaltDerElementeSetzen(anzahlStrings, strFeld);
    	ausgeben(anzahlStrings, strFeld);
    	return 0;
    }
    

    Vielen Dank schonmal!

    P.S.: Ändere ich die Methode ausgeben() folgendermaßen um, werden zwar alle Wörter komplett ausgegeben, aber zusätzlich noch einige Zeichen (z.B.: | , ² usw.)

    void ausgeben(int anzahlStrings, char ** strFeld){
    	for(int i = 0; i < anzahlStrings; i++)
    		printf("%s\n", *(strFeld+i));
    }
    


  • Ach so.....das würde vielleicht erklären, warum die Ausgabe so seltsam aussieht?



  • // Speicherplatz in Wortlänge reservieren
            strFeld[i] = new char[eingabe.length()];
    
            // Wort einspeichern
            for(int k = 0; k < eingabe.length(); k++)
                strFeld[i][k] = eingabe[k];
    

    Du reservierst Dir genau ein Zeichen zuwenig für den String, da ein C-String im Speicher immer mit einem Nullbyte aufhört. Deshalb kommen die zusätzlichen Zeichen (er "weiss" nicht dass der String dort zuende ist und druckt das was danach im Speicher steht mit aus).

    // Speicherplatz in Wortlänge reservieren
            strFeld[i] = new char[eingabe.length() + 1];
    
            // Wort einspeichern
            for(int k = 0; k < eingabe.length(); k++)
                strFeld[i][k] = eingabe[k];
            strFeld[i][eingabe.length()] = '\0';
    

    Noch besser wäre natürlich (wenn schon strlen, warum nicht auch den Rest?)

    // Speicherplatz in Wortlänge reservieren
            strFeld[i] = new char[eingabe.length() + 1];
    
            // Wort einspeichern
            strcpy(strFeld[i], eingabe.c_str());
    


  • Hallo!

    Danke sehr! Mit folgemdem Code funktioniert es jetzt:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void zeigerAufNullSetzen(int anzahlStrings, char ** strFeld){
    	for(int i = 0; i < anzahlStrings; i++)
    		strFeld[i] = NULL;
    }
    
    void inhaltDerElementeSetzen(int anzahlStrings, char ** strFeld){
    	string eingabe;
    	for(int i = 0; i < anzahlStrings; i++){
    		// Wort einlesen
    		cout << "Wort Nummer " << i+1 << ": ";
    		cin >> eingabe;
    
    		// Speicherplatz in Wortlänge reservieren
    		strFeld[i] = new char[eingabe.length() +1];
    
    		// Wort einspeichern
    		for(int k = 0; k < eingabe.length(); k++)
    			strFeld[i][k] = eingabe[k];
    		strFeld[i][eingabe.length()] = '\0';
    	}
    }
    
    void ausgeben(int anzahlStrings, char ** strFeld){
    	for(int i = 0; i < anzahlStrings; i++)
            printf("%s\n", strFeld[i]);
    
    }
    
    int main ()
    {
    	int anzahlStrings=5;
    	char **strFeld = new char*[anzahlStrings];
    
    	zeigerAufNullSetzen(anzahlStrings, strFeld);
    	inhaltDerElementeSetzen(anzahlStrings, strFeld);
    	ausgeben(anzahlStrings, strFeld);
    	return 0;
    }
    


  • Allgemein zur Größe von Arrays:

    1. sizeof-Operator

    int array[100];
    int size = sizeof(array) / sizeof(*array);
    

    Das geht aber nicht wenn du das Array implizit mal in einen Pointer umwandelst, was schnell passieren kann:

    int array[100];
    int *pointer = array;
    int size = sizeof(pointer) / sizeof(*pointer); // oops!
    

    Vorteil von dem ganzen ist dass es zur Compile-Zeit abläuft, bin mir bei der nächsten Methode nicht ganz sicher ob das ein Compiler wegoptimieren kann:

    2. templates

    template<class Type, size_t ArraySize>
    size_t array_size(Type const (&array)[ArraySize])
    {
        return ArraySize;
    }
    

    Das geht zwar auch nicht mit Pointern, aber da bekommt man eine schöne Fehlermeldung des Compilers und kann sich so langes Debugging ersparen.

    Gruß


Anmelden zum Antworten