An Variabelnamen Text anhängen



  • Ist es möglich, den Namen einer Variabel mit einer Rechnung zu erweitern?
    Ich habe mir verschiedene Arrays angelegt, welche Text speichern, alle haben den Namen "Name" und dann eine Zahl. Hier der Quellcode :

    #include <iostream>
    using namespace std;
    
    int main ()
    {
    	char Name1[] = "Dieter";
    	char Name2[] = "Klaus";
    	char Name3[] = "Peter";
    	char Name4[] = "Heinz";
    	char Name5[] = "Hans";
    	char Name6[] = "Rolf";
    	char Name7[] = "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(Auswahl-1);
    	return 0;
    }
    

    In Zeile 25 wollte ich jetzt den Namen der Variabel noch die Auswahl hinten dran ändern. So wie ich das da jetzt machen wollte geht es ja leider nicht. Kann man das auch irgendwie anders machen? Danke schon mal.



  • Du hast also eine Nummer und willst an die entsprechende Variable kommen?
    Nimm ein Array.



  • 😕 Also ich weiß jetzt ehrlich gesagt nicht, wo ich da einen Array benutzten soll.



  • Nun du willst auf die Variable Name<Nummer> zugreifen.
    Aktuell schreibst du: Name(Auswahl-1)
    Damit biste schon nah dran.
    Die richtige Syntax lautet: Name[Auswahl - 1]
    Hilft dir das?



  • Earlopain schrieb:

    😕 Also ich weiß jetzt ehrlich gesagt nicht, wo ich da einen Array benutzten soll.

    z.B. Ein Array von Namen.



  • Ich steh grad irgendwie aufm Schlauch. Wenn ich "Name[Auswahl-1]" schreibe ist die Variabel Name immer noch nicht da. Das wird immer noch nicht da rangehängt.



  • Earlopain schrieb:

    Ich steh grad irgendwie aufm Schlauch. Wenn ich "Name[Auswahl-1]" schreibe ist die Variabel Name immer noch nicht da. Das wird immer noch nicht da rangehängt.

    Natürlich nicht. Das geht so nicht direkt.
    Du nimmst dann aber ein Array von strings, das nennste name und initialisierst es entsprechend.



  • Tut mir leid, wenn ich hier jetzt weiter nerven muss, ich habe jetzt noch "char Name[] = "Name";" zum Quelltext hinzugefügt, jetzt gibt es schon mal keine Fehlermeldung mehr, die richtigen Namen werden trotzdem noch nicht ausgegeben. Stattdessen stehen da einzelne Buchstaben oder Zeichen, von denen ich noch nicht mal wusste, dass sie existieren.



  • Earlopain schrieb:

    Tut mir leid, wenn ich hier jetzt weiter nerven muss, ich habe jetzt noch "char Name[] = "Name";" zum Quelltext hinzugefügt, jetzt gibt es schon mal keine Fehlermeldung mehr, die richtigen Namen werden trotzdem noch nicht ausgegeben. Stattdessen stehen da einzelne Buchstaben oder Zeichen, von denen ich noch nicht mal wusste, dass sie existieren.

    Kauf Dir ein Grundlagenbuch.



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

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    char* strdup(const char *s)
    {
        char* temp = static_cast<char*>(malloc(strlen(s) + 1));
        return (temp != NULL) ? strcpy(temp, s) : NULL;
    }
    
    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");
    
        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[Auswahl-1] << endl;
    
        for(int i = 0; i < 7; i++) {
        	if( Name[i] != NULL )
        		free(Name[i]);
        }
    
        return 0;
    }
    


  • Earlopain schrieb:

    Ich steh grad irgendwie aufm Schlauch. [...]

    char const * Name[] = {
    	"Dieter",
    	"Klaus",
    	"Peter",
    	"Heinz",
    	"Hans",
    	"Rolf",
    	"Dietmar"
    };
    

    ...

    // edit:

    Logn schrieb:

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

    nicht ernsthaft, gell?



  • Earlopain schrieb:

    Tut mir leid, wenn ich hier jetzt weiter nerven muss, ich habe jetzt noch "char Name[] = "Name";" zum Quelltext hinzugefügt, jetzt gibt es schon mal keine Fehlermeldung mehr, die richtigen Namen werden trotzdem noch nicht ausgegeben. Stattdessen stehen da einzelne Buchstaben oder Zeichen, von denen ich noch nicht mal wusste, dass sie existieren.

    Das ist ja auch kein Array von Strings, sondern ein Array von Zeichen.
    Befolg den Rat von mgaeckler, kauf dir ein gutes (!) Grundlagenbuch.



  • @Swordfish: strdup ist kein Standard, ich wollte es aber trotzdem nutzen und mal zeigen wie verworren selbst einfache Sachen in C werden können. Es sollte mehr ein abschreckendes Beispiel sein, damit er sich mal die C++-Grundlagen und vor allem die STL anschaut.



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


Anmelden zum Antworten