An Variabelnamen Text anhängen



  • Ein C/C++-Beispiel für eine Frage zu C++ im C++-Forum. Toll. Dann schreib wenigstens dazu, was daran bescheuert ist, damits der nächste nicht nachmacht!



  • Um das noch klarzustellen: In dem compilierten Programm gibt es keine Variablennamen mehr (gut, es gibt Ausnahmen, hier ist das egal). Name hat nur im Quellcode eine Bedeutung, zur Laufzeit kann man keine Variablennamen dynamisch zusammenstellen, wie das beispielsweise in PHP möglich ist.



  • Ok, mein Beispiel war Müll. Hier eine C++ Variante ohne C-Code

    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    int main ()
    {
        vector<string> Name;
    
        Name.push_back("Dieter");
        Name.push_back("Klaus");
        Name.push_back("Peter");
        Name.push_back("Heinz");
        Name.push_back("Hans");
        Name.push_back("Rolf");
        Name.push_back("Dietmar");
    
        int Auswahl;
    
        cout << "Name auswaelen: " << endl;
        cout << "Dieter (1)" << endl;
        cout << "Klaus (2)" << endl;
        cout << "Peter (3)" << endl;
        cout << "Heinz (4)" << endl;
        cout << "Hans (5)" << endl;
        cout << "Rolf (6)" << endl;
        cout << "Dietmar (7)" << endl;
        cin >> Auswahl;
        cout << "Dein Name ist: " << Name.at(Auswahl-1) << endl;
    
        return 0;
    }
    


  • Logn schrieb:

    Du kannst das so hier machen, aber das ist C und C++ gemischt, besser wäre es einen Vektor der Standardlib zu nutzen.

    Nein, warum?

    Logn schrieb:

    char* strdup(const char *s)
    {
        char* temp = static_cast<char*>(malloc(strlen(s) + 1));
        return (temp != NULL) ? strcpy(temp, s) : NULL;
    }
    

    Sieht rundweg doof aus.

    int main ()
    {
        char *Name[7];
        Name[0] = strdup("Dieter");
        Name[1] = strdup("Klaus");
        Name[2] = strdup("Peter");
        Name[3] = strdup("Heinz");
        Name[4] = strdup("Hans");
        Name[5] = strdup("Rolf");
        Name[6] = strdup("Dietmar");
    //Was hattest Du gegen die Array-Initialisierung? 
    
        int Auswahl;
    
        cout << "Name auswaelen: " << endl;
        cout << "Dieter (1)" << endl;
        cout << "Klaus (2)" << endl;
        cout << "Peter (3)" << endl;
        cout << "Heinz (4)" << endl;
        cout << "Hans (5)" << endl;
        cout << "Rolf (6)" << endl;
        cout << "Dietmar (7)" << endl;
    //zu viel endl
    //warum keine Schleife?
        cin >> Auswahl;
    //Auswahl geht lokaler
    
        cout << "Dein Name ist: " << Name[Auswahl-1] << endl;
    
        for(int i = 0; i < 7; i++) {
        	if( Name[i] != NULL )
        		free(Name[i]);
        }
    //Ach, hier geht dann eine Schleife. Brauchst aber nicht bei free gegen 
    //NULL zu prüfen. Und hier eh nicht, weil Prog schon in der cout-Zeile 
    //abgestürzt ist. 
    
        return 0;
    }
    


  • und dann erledigen wir noch die sinnlosen endl s und tadaaa:

    #include <array>
    #include <iostream>
    
    int main ()
    {
    	std::array< char const *, 7 > names {{
    		"Dieter", "Klaus", "Peter", "Heinz", "Hans",
    		"Rolf", "Dietmar"
    	}};
    
    	std::cout << "Name auswaelen:\n";
    	for( std::size_t i = 0; i < names.size(); ++i )
    		std::cout << names[ i ] << '(' << i + 1 << ")\n";
    
    	unsigned choice;
    	std::cin >> choice;
    	std::cout << "Dein Name ist: " << names.at( choice - 1 ) << '\n';
    }
    


  • Ich wollte seinem Original so gut es geht entsprechen. Ich habe doch schon geschrieben dass es Müll ist. Ihr könnte ja noch den perfekten Code daraus basteln. Unter dem Strich hilft es ihm eh nicht viel, denn er muss die Grundlagen erst einmal beherrschen lernen.

    @Swordfish: Ist zwar guter Code, aber ich glaube jetzt blickt der TE überhaupt nicht mehr durch, aber Hauptsache der Code ist korrekt 🤡



  • Wenn schon jeder seine Lieblingsvariante postet:

    #include <array>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        const array<const char*, 7> Name {
            "Dieter",
            "Klaus",
            "Peter",
            "Heinz",
            "Hans",
            "Rolf",
            "Dietmar"
        };
    
        cout << "Name auswaehlen:\n";
        for (size_t i = 0; i < Name.size(); ++i)
            cout << Name[i] << " (" << i+1 << ")\n";
    
        unsigned wahl;
        cin >> wahl;
        if (!cin || wahl > Name.size() || wahl == 0) { // ok, fast kein crash (edit)
            cout << "bad input.\n";
            return 1;
        }
        cout << "Dein Name ist: " << Name[wahl-1] << '\n';
    }
    

    P.S.: Meine Lösung crasht nicht bei blöder eingabe *hust*
    Und bei mir passiert nicht sowas:

    // ...
    names[0] = "whoops";
    // ...
    

    *duck und wegrenn*



  • Logn schrieb:

    [...] Unter dem Strich hilft es ihm eh nicht viel, [...]

    Ich möchte daran glauben, daß es Anfängern eher hilft, "schönen" Code gezeigt zu bekommen, als "hässlichen". ... und wenn schon ausnahmsweise hässlichen, dann aus Gutem Grundtm inklusive Erklärung, warum er hässlich ist.



  • Aber sind schöne Beispiele, das mal wieder viele Wege nach Rom führen.

    @Swordfish: Ja, hast ja recht und dein Code ist ganz toll 👍. Wenn ich einen Orden übrig hätte, würde ich ihn dir geben. 🤡



  • HarteWare schrieb:

    P.S.: Meine Lösung crasht nicht bei blöder eingabe *hust*

    Gib mal 0 ein ... 🤡

    Logn schrieb:

    @Swordfish: Ja, hast ja recht und dein Code ist ganz toll 👍. Wenn ich einen Orden übrig hätte, würde ich ihn dir geben. 🤡

    Hey, ich bleib auch lieb 🙄



  • Swordfish schrieb:

    HarteWare schrieb:

    P.S.: Meine Lösung crasht nicht bei blöder eingabe *hust*

    Gib mal 0 ein ... 🤡

    xd das ist mir auch aufgefallen und ich habs ganz schnell editiert (siehe Kommentar) 😃



  • @Swordfish
    Man das war Spaß, deswegen der Clown. Ich habe mich ja wegen Leute wie dir extra hier angemeldet, weil ich als Anfänger viel lernen kann. Das mein Code dann auseinandergenommen wird ist mir doch klar und auch völlig legitim.

    EDIT: Hier kommen ja die Antworten wie aus dem Maschinengewehr.


Anmelden zum Antworten