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ß