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 da rand() nur eine pseudo-Zufallszahl generiert. schau dir mal den Artikel an: http://www.cplusplus.com/reference/clibrary/cstdlib/rand.html
    Edit: quote tags

    mfg





  • 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.


Anmelden zum Antworten