Funktionsweise unverständlich
-
Hallo,
warum wird in strAlphabet[i] erst über i das Alphabet in Kleinbuchstaben geschrieben. Würde die Zeile weggelassen werden nur kryptische Ascii Zeichen die ausserhalb des in der Forschleife angegebenen Bereichs ausgegeben.
char strAlphabet[26]; for (i=97;i<123;i++) { strAlphabet[i]= i; // Warum??? //i = rand(); cout << strAlphabet[i]; }Ausserdem verstehe ich nicht wie ich rand() benutze. i = rand() führt zum Absturz. Geht die Funktion über die Größe des Arrays hinaus?
-
Hallo,
SpeicherFragezeichen schrieb:
for (i=97;i<123;i++) { strAlphabet[i]= i; // Warum???dein index ist bei 97 - 122 du hast aber nur 0-25 zur verfügung. Du überschreibst erstens den speicher ausserhalb deines arrays (was zu einer stack corruption führt)
BR
Vinzenz//Edit quote tag repariert
-
SpeicherFragezeichen schrieb:
Hallo,
warum wird in strAlphabet[i] erst über i das Alphabet in Kleinbuchstaben geschrieben. Würde die Zeile weggelassen werden nur kryptische Ascii Zeichen die ausserhalb des in der Forschleife angegebenen Bereichs ausgegeben.
char strAlphabet[26]; for (i=97;i<123;i++) { strAlphabet[i]= i; // Warum??? //i = rand(); cout << strAlphabet[i]; }Ausserdem verstehe ich nicht wie ich rand() benutze. i = rand() führt zum Absturz. Geht die Funktion über die Größe des Arrays hinaus?
char strAlphabet[26]; for (i=97;i<123;i++) { strAlphabet[i-97]= i; // Darum! //i = rand(); cout << strAlphabet[i]; }
-
evilissimo schrieb:
Hallo,
SpeicherFragezeichen schrieb:
for (i=97;i<123;i++) { strAlphabet[i]= i; // Warum???dein index ist bei 97 - 122 du hast aber nur 0-25 zur verfügung. Du überschreibst erstens den speicher ausserhalb deines arrays (was zu einer stack corruption führt)
BR
Vinzenz//Edit quote tag repariert
char strAlphabet[26]; for (i=97;i<123;i++) { strAlphabet[i-97]= i; //i = rand(); cout << strAlphabet[i-97]; }
-
SpeicherFragezeichen schrieb:
Ausserdem verstehe ich nicht wie ich rand() benutze. i = rand() führt zum Absturz
Du hast
srand( unsigned seed )vergessen. Die funktion benötigst du darand()nur eine pseudo-Zufallszahl generiert. schau dir mal den Artikel an: http://www.cplusplus.com/reference/clibrary/cstdlib/rand.html
Edit: quote tagsmfg
-
-
Warum ist immer noch etwas falsch?
Ich hatte vor, dass das Alphabet nicht sortiert ausggeben wird, sondern nach Zufallsprinzip.
Danke.
int i,j; char strAlphabet[26]; for (i=97;i<123;i++) { strAlphabet[i-97]= i; srand ( time(NULL) ); i = rand() % 25 + 1; cout << strAlphabet[i-97]; }
-
SpeicherFragezeichen schrieb:
Warum ist immer noch etwas falsch?
Ich hatte vor, dass das Alphabet nicht sortiert ausggeben wird, sondern nach Zufallsprinzip.
Danke.
int i,j; char strAlphabet[26]; for (i=97;i<123;i++) { strAlphabet[i-97]= i; srand ( time(NULL) ); i = rand() % 25 + 1; cout << strAlphabet[i-97]; }Ach du scheisse!
Erstmal musst du dein Alphabet erzeugen. Du kannst nicht während des Vorgangs schon auf spätere Elemente zugreifen, wenn es die noch gar nicht gibt.
Zudem sollte srand() nur einmal im Programm aufgerufen werden (am besten zu Beginn :P), also raus damit aus der Schleife. Dann weist du i einen neuen Wert zu, der dann im Array garantiert unter 123 (weil i - 97 < 0) liegt => Endlosschleife. Wobei dein Index anschließend < 0 ist => Undef. Verhalten.
Mach es lieber so:
srand(time(NULL)); int i,j; char strAlphabet[26]; // Erstmal das Alphabet erzeugen for (i=0;i<26;i++) strAlphabet[i]= i + 97; // "Alphabet" ausgeben for (i=0;i<26;i++) { j = rand() % 25 + 1; cout << strAlphabet[j]; }Dabei ist aber nicht garantiert, dass auch das gesamte Alphabet ausgegeben wird, es werden sehr wahrscheinlich Werte mehrmals vorkommen.
-
nasnfos schrieb:
Dabei ist aber nicht garantiert, dass auch das gesamte Alphabet ausgegeben wird, es werden sehr wahrscheinlich Werte mehrmals vorkommen.
Du kannst dich eigentlich drauf verlassen, dass wenigstens ein Wert mehrmals vorkommt. Deshalb rate ich auch zur Methode mit der STL:
#include <string> #include <algorithm> #include <ctime> int main() { // srand(), damit unterschiedliche Ergebnisse bei verschiedenen Programmdurchläufen srand(static_cast<unsigned int>(time(0))); // String anlegen und mit allen Buchstaben befüllen std::string Alphabet; for (char i = 'a'; i <= 'z'; ++i) { Alphabet.push_back(i); } // Alphabet zufällig durchmischen std::random_shuffle(Alphabet.begin(), Alphabet.end()); }Denn selber zufällig sortieren ist nicht gerade einfach. In diesem Thread geht es übrigens um etwas ziemlich Ähnliches.