Funktionsabbruch



  • Hey!
    bei meiner Funktion, deren Aufgabe es ist, den User nach seiner Sprache zu fragen und ihn dann in derselben zu begrüßen, läuft was nicht richtig. Der Vorname klappt, aber nach der Frage nach dem Nachnamen bricht er ab und schreibt dann schon die Begrüßung, ohne jedoch wenigstens den Vornamen auch komplett auszugeben... frage mich was da fehlt?
    Gruß

    #include <iostream>
    using namespace std;
    
    void deutsch();
    void englisch();
    char vorname;
    char nachname;
    char *zeiger_auf_vornamen;
    char *zeiger_auf_nachnamen;
    
    int main()
    
    {
        int sprache;
    
                cout << "Bitte Sprache wählen (deutsch=1 oder englisch=2): ";
                cin  >> sprache;
    
                switch(sprache) {
    
            case 1: deutsch();
                            break;
    
            case 2: englisch();
                            break;
    
            default: cout << "Falsche Sprache"<< endl;
            break;
    
        }
    
                if (sprache==1)
                    cout << "Herzlich Willkommen " << *zeiger_auf_vornamen << " " << *zeiger_auf_nachnamen << "Wir wünschen Ihnen einen angenehmen Aufenthalt"<< endl;
                if (sprache==2) cout << "Welcome " << *zeiger_auf_vornamen << " " << *zeiger_auf_nachnamen << "We wish you a pleasant stay"<< endl;
    
    }
    
        void deutsch()
        {
                cout << "Bitte geben Sie Ihren Vornamen ein: " << endl;
                cin >> vorname;
                cout << "Bitte geben Sie Ihren Nachnamen ein: "<< endl;
                cin >> nachname;
                zeiger_auf_vornamen = &vorname;
                zeiger_auf_nachnamen = &nachname;
                return;
    
        }
    
                void englisch()
                        {
                cout << "Please wirite your surname: "<< endl;
                cin >> vorname;
                cout << "Please write your prename: "<< endl;
                cin >> nachname;
                zeiger_auf_vornamen = &vorname;
                zeiger_auf_nachnamen = &nachname;
                return;
    
    }
    

  • Mod

    Wichtig:
    1. Keine globalen Variablen benutzen
    2. Nicht ohne guten Grund char-Arrays anstatt std::string benutzen, insbesondere wenn man mit char-Arrays nicht umgehen kann.

    Formulier dein Programm mit std::string und mit sauberen Variablenübergaben und es wird funktionieren.

    (Unmittelbarer Fehler ist hier übrigens, dass dein vorname und nachname vom Typ char sind, der nur ein einzelnes Zeichen repräsentiert. Das ist aber bloß ein Symptom von den genannten Hauptfehler, vor allem von Punkt 2)



  • #include <iostream>
    using namespace std;
    
    void deutsch();
    void englisch();
    char vorname;
    char nachname;
    char *zeiger_auf_vornamen;
    char *zeiger_auf_nachnamen;
    
    int main()
    {
        int sprache;
    
        cout << "Bitte Sprache wählen (deutsch=1 oder englisch=2): ";
        cin >> sprache;
    
        switch(sprache) {
            case 1: deutsch();
            break;
            case 2: englisch();
            break;
            default: cout << "Falsche Sprache"<< endl;
            //default brauch kein break! es ist die letzte Option
        }
    
        if (sprache==1) {
            cout << "Herzlich Willkommen " << *zeiger_auf_vornamen <<
            " " <<    *zeiger_auf_nachnamen << "Wir wünschen Ihnen einen"  
            << " angenehmen Aufenthalt"<< endl;
        }
        if (sprache==2) {
           cout << "Welcome " << *zeiger_auf_vornamen << " " <<     
           *zeiger_auf_nachnamen << "We wish you a pleasant stay"<< endl;
        }
    }
    
    void deutsch()
    {
        cout << "Bitte geben Sie Ihren Vornamen ein: " << endl;
        cin >> vorname;
        cout << "Bitte geben Sie Ihren Nachnamen ein: "<< endl;
        cin >> nachname;
        zeiger_auf_vornamen = &vorname;
        zeiger_auf_nachnamen = &nachname;
        //void brauch kein return !
    }
    
    void englisch()
    {
        cout << "Please wirite your surname: "<< endl;
        cin >> vorname;
        cout << "Please write your prename: "<< endl;
        cin >> nachname;
        zeiger_auf_vornamen = &vorname;
        zeiger_auf_nachnamen = &nachname;
        //void brauch kein return !
    }
    

    Du solltest lieber std::string benutzen!



  • Prima, es funktioniert!
    JA, da vertiefe ich mich jetzt mal in Richtung saubere Variablenübergabe und char...
    besten Dank für die prompte Hilfestellung,
    Grüße ins Forum



  • #include <limits>
    #include <vector>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    void clear_istream( std::istream &is )
    {
        is.clear();
        is.ignore( numeric_limits< streamsize >::max(), '\n' );
    }
    
    typedef enum {  LANGUAGE_DE, LANGUAGE_EN, LANGUAGE_MAX } language_t;
    typedef enum {  MSG_LANGUAGE_NAME, MSG_CHOOSE_LANGUAGE, MSG_INPUT_ERROR,
                    MSG_INPUT_NAME, MSG_INPUT_SURNAME, MSG_WELCOME, MSG_WISH } message_t;
    
    int main()
    {
        std::vector< std::string > language_de;
        std::vector< std::string > language_en;
        language_de.push_back( "Deutsch" );
        language_en.push_back( "English" );
        language_de.push_back( "Bitte waehlen Sie Ihre Sprache:" );
        language_en.push_back( "Please choose your language:" );
        language_de.push_back( "Ungueltige Eingabe. Bitte versuchen Sie es erneut!\n" );
        language_en.push_back( "Input error. Please try again!\n" );
        language_de.push_back( "Bitte geben Sie Ihren Vornamen ein: " );
        language_en.push_back( "Please enter your name: " );
        language_de.push_back( "Bitte geben Sie Ihren Nachnamen ein: " );
        language_en.push_back( "Please enter your surname: " );
        language_de.push_back( "Herzlich Willkommen" );
        language_en.push_back( "Welcome");
        language_de.push_back( "Wir wuenschen Ihnen einen angenehmen Aufenthalt!" );
        language_en.push_back( "We wish you a pleasant stay!" );
    
        std::vector< std::vector< std::string > > languages;
        languages.push_back( language_de );
        languages.push_back( language_en );
    
        std::vector< std::vector< std::string > >::size_type choosen_language = 1;
    
        for( auto it = languages.begin(); it != languages.end(); ++it, ++choosen_language ) {
    
            cout    << ( *it )[ MSG_CHOOSE_LANGUAGE ] << " ( "
                    << ( *it )[ MSG_LANGUAGE_NAME ] << " = " << choosen_language << " )\n";
        }
    
        choosen_language = LANGUAGE_MAX + 1;
        while( !( cin >> choosen_language ) || ( !choosen_language || choosen_language > LANGUAGE_MAX ) ) {
    
            for( auto it = languages.begin(); it != languages.end(); ++it ) {
    
                cout << ( ( *it )[ MSG_INPUT_ERROR ] );
            }
            cout.put( '\n' );
            cout.flush();
            clear_istream( cin );
        }
    
        --choosen_language;
    
        cout << languages[ choosen_language ][ MSG_INPUT_NAME ];
        std::string( name );
        cin >> name;
    
        cout << languages[ choosen_language ][ MSG_INPUT_SURNAME ];
        std::string surname;
        cin >> surname;
    
        cout << languages[ choosen_language ][ MSG_WELCOME ] << ", " << name << " " << surname << "!\n";
        cout << languages[ choosen_language ][ MSG_WISH ] << "\n\n";
    }
    


  • @Swordfish
    Solche Lösungen bringen dann Probleme, wenn die einzelnen Satzbauteile in unterschiedlichen Sprachen an verschiedenen Positionen stehen. Ich finde Platzhalter flexibler:

    Pseudo Code:

    Something LanguageData;
    
    std::string make_localized_string( unsigned int ID, const std::string& W1 )
    {
       ostringstream oss;
    
       std::string Entry = LanguageData.get_entry( ID_Welcome );
       foreach( Token in Entry )
       {
          if( oss.tellp() != 0 ) oss << " ";
          if( Token is PlaceHolder ) oss << W1;
          else                       oss << Token;
       }
       return oss.str();
    }
    
    std::string make_localized_string( unsigned int ID, const std::string& W1, const std::string& W2 )
    {
       ostringstream oss;
    
       std::string Entry = LanguageData.get_entry( ID_Welcome );
       foreach( Token in Entry )
       {
          if( oss.tellp() != 0 ) oss << " ";
          if( Token is PlaceHolder1 )       oss << W1;
          else if( Token is PlaceHolder2 )  oss << W2;
          else                              oss << Token;
       }
       return oss.str();
    }
    


  • Swordfish schrieb:

    ...code...
    

    Du bist ja voll der Hecht. Das bringt einen Anfänger natürlich richtig weiter. Vor allem, weil der Code so gut kommentiert ist.



  • schau, ich habe in den letzten zwei Jahren ziemlich selten programmier. Z. Zt. bin ich ueber (fast) jede sinnfreie Aufgabe froh, um die Basics wieder griffbereit in den aktiven Wortschatz zu bekommen. Wen es stört möge meine Lösungen bitte ignorieren. Sollte sich jemand die Mühe machen konstruktiv zu kritisieren, bin ich dankbar.


Anmelden zum Antworten