Länge eines Arrays bestimmen
-
Hallo,
ich habe das Problem, dass ich es nicht schaffe die Länge (Menge der Einträge) eines Arrays festzustellen. Folgenden Ansatz habe ich:#include <iostream> #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*(x))-1) using namespace std; int main(){ char test[] = "Testtext"; cout << ARRAY_SIZE(test) << endl; //Das klappt problemlos char eingabe[] = ""; cin >> eingabe; cout << ARRAY_SIZE(eingabe); //Das klappt nicht, es wird immer 0 ausgegeben return 0; }Weiß jemand, wie ich das Problem lösen kann?
mfG, schwerminator
-
dein code ist eh kaputt
-
sizeof() wird zur Compile-Zeit ausgewertet, deswegen funktioniert es auch nur bei Arrays deren Länge zur Compile-Zeit festgelegt ist.
Außerdem garantiert dir
char eingabe[] = ""; cin >> eingabe;schon fast einen Buffer-Overflow
Nutz lieber std::string für Strings.
Für andere Datentypen gibt es dann noch std::vector etc.
-
Hallo schwerminator,
du hast leider keine Chance an die Größe eines Arrays zu kommen.
Das klappt im ersten Fall nur, weil du ein Array mit statischer Größe hast,
das schon zur Kompilierzeit feststeht.Außerdem greifst du an dieser Stelle auf Speicherbereich zu, den du nicht
alloziiert hast:schwerminator schrieb:
char eingabe[] = "";
cin >> eingabe;
cout << ARRAY_SIZE(eingabe); //Das klappt nicht, es wird immer 0 ausgegebenbtw: Dein Array ist ja wirklich 0 groß

EDIT: Shit! Viel zu langsam ^^
Gruß,
CSpille
-
The-Kenny schrieb:
sizeof() wird zur Compile-Zeit ausgewertet, deswegen funktioniert es auch nur bei Arrays deren Länge zur Compile-Zeit festgelegt ist.
Das erklärt einiges, Danke. Bzgl. des Rests des Codes muss ich mir noch einiges aneignen.
mfG, schwerminator
-
Hmm also ich bekomme das nicht auf die Reihe. Mein Ziel ist es eine Eingabe dahingehend zu überprüfen, ob es eine Zahl ist. Wenn ja wird die Zahl als float zurückgegeben, falls nicht, wird Null zurückgegeben. Ich mache das ganze aus folgendem Grund: Wenn ich die Eingabe-Variable direkt als integer deklariere und keine Ziffer eingegeben wird, stürzt das Programm ab. Deshalb muss sie irgendwie als char deklariert und eingelesen und anschließend verarbeitet werden. Mein Versuch war der folgende, der ja aber wie gesagt nicht funktioniert. Wie kann ich die Problematik lösen?
#include <iostream> #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*(x))-1) using namespace std; float stringToInt(char string[]){ char vorkomma[] = "", nachkomma[] = ""; int vorkomma_int, nachkomma_int, gesamt; bool punkt = false; for(int i = 0; i < ARRAY_SIZE(string); i++){ if(isdigit(string[i]) || (string[i] == '.' && punkt == false)){ if(string[i] != '.'){ if(punkt == false) vorkomma[ARRAY_SIZE(vorkomma)] = string[i]; else nachkomma[ARRAY_SIZE(vorkomma)] = string[i]; } else punkt = true; } else return 0; } return atoi(nachkomma); } int main(){ char eingabe[] = ""; cin >> eingabe; cout << stringToInt(eingabe); cin >> eingabe; return 0; }
-
Lies dir bitte die vorigen Beiträge nochmal durch. Insbesondere das über die Länge deines Arrays. Weiterhin solltest du in die FAQ schauen "Einmal Zahl nach String und zurück"
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html
-
Du hast immernoch keinen Speicher für die Eingabe reserviert. Lies die vorangegangenen Beiträge nochmal.
-
#include <limits.h> // Returns true on success. The converted value is stored in pInt. // Returns false, if the conversion fail; bool StrtoInt( string str, int& pInt ) { float f; int m = INT_MAX; int n = 10; int i = 0; pInt = 0; while( m > 0 ) { m /= n; i++; } if ( str.length() > i ) { cout << "String too long." << endl; return false; } f = atof(str.c_str()); if( f > INT_MAX || f < INT_MIN ) { cout << "Number out of scope." << endl; return false; } pInt = (int)f; return true; } bool IntOnly( string str ) { int i = 0; if ( str[i] == '+' || str[i] == '-' ) { if ( str.length() == 1 ) return false; i++; } for ( i; i<str.size(); i++ ) { if ( !isdigit(str[i]) ) return false; } return true; } int main(int argc, char *argv[]) { string str; int iInput; do { cout << "Ey Alter, gimma n Integer ein, ey !" << endl; cin >> str; }while( !IntOnly(str) ); if ( StrtoInt(str, iInput) ) cout << iInput << endl; getchar(); return 0; }