Probleme mit den Umlauten



  • Mein Problem ist eigentlich ein ganz triviales, hinter deren Ursache ich aber nicht komme, weil es mal auftritt und mal nicht 🙂 .

    int main()
    {
    	Schiffe Sch1;
    	Schiffe Sch2;
    
    	Sch1.setStaerke(1);
    	Sch1.setName("Kanonenboot");
    	Sch2.setStaerke(2);
    	Sch2.setName("Zerst\x94rer");
    
    	cout << "Kampf " << Sch1.getName() << " gegen " << Sch2.getName() << endl << endl;
    		if (Sch1.getStaerke() < Sch2.getStaerke())
    		{	
    			srand( (unsigned)time( NULL) );
    			uli gewonnen = rand() % 4 + 1;
    			if (gewonnen < 4)
    				{
    				cout << Sch2.getName() << " hat gewonnen!" << endl;
    				}
    			else 
    				{
    				cout << Sch1.getName() << " hat \x81berraschenderweise gewonnen!" << endl;
    				}
    		}
    		else
    		{
    			cout << "fc" << endl;
    		}
    
    	return 0;
    }
    

    Also der Compiler stört sich nicht am Schiffsname Zerstörer, bei überraschenderweise allerdings bringt er folgende Fehlermeldung:
    error C2022: '33214' : Zu gross fuer ein Zeichen
    Am Ü liegts nicht, da er sich über einen Zerstürer auch nicht beschwert. Wenn ich das \x81 vor hat stelle ("ühat berrschenderweise...") hat er auch kein Problem damit.
    Ich hoffe ihr wisst die Lösung für mein Problem.
    Vielen Dank im voraus 😉



  • Ich vermute, es liegt daran, dass der Compiler die nachfolgenden beiden Buchstaben b und e noch mit in die Hex-Folge einbezieht: \x81be. Und das ist 33214, mithin zu groß für ein char. 2 schnelle Lösungsvorschläge:

    1. Oktal: "\201berraschenderweise"
    2. Zeichenkettenkonkatenation durch den Präprozessor: "\x81" "berraschenderweise"


  • behelf dir so:

    cout <<" hat "<<static_cast < unsigned char > ( 129 )<<"berraschenderweise gewonnen!" << endl;
    

    im konsolenfaq stehen die ü,ö,ä .. 's



  • K, Vielen Dank, jetzt klappt es 😉



  • // dummy-komentar, weil die erste Zeile eines cpp-Block nicht eingerückt werden kann
        Schiffe Sch1; 
        Schiffe Sch2; 
    
        Sch1.setStaerke(1); 
        Sch1.setName("Kanonenboot"); 
        Sch2.setStaerke(2); 
        Sch2.setName("Zerst\x94rer");
    

    Was hälst du davon deinen Konstruktor zu überladen?

    // ebenfalls dummy
        Schiffe Sch1("Kanonenboot", 1); 
        Schiffe Sch2("Zerst" "\x94" "rer", 2);
    

    Ein setName finde ich allgemein recht unnütz, da sich die Bezeichnung eines Schiffes wohl nie ändern wird.

    /edit: dummy-Komentarre eingefügt.


Anmelden zum Antworten