Strings in C++



  • Hay Leute,

    #include<iostream>
    #include<string>
    
    //#include "functions.h"
    
    using namespace std;
    
    int main()
    {
        string Eingabe;
        string Befehl;
        string Operant[2];
        string Opcode;
        int Zaehler;
    
        while(1)
        {
        	Zaehler=0;
            cout << "Bitte einen Befehl eingeben: ";
    
            getline(cin, Eingabe);
            //Eingabe=trim(Eingabe);
    
            while(!(Eingabe[Zaehler]==' ' || Eingabe[Zaehler]=='\0'))
            {
                Befehl[Zaehler]=Eingabe[Zaehler];
                Zaehler++;
            }
    
            cout << "Der bisher eingegebene Befehl ist: " << Befehl.c_str() << endl;
    
            if(Befehl=="hlt") Opcode="F4";
            if(Befehl=="cli") Opcode="FA";
            if(Befehl=="sti") Opcode="FB";
            if (Befehl=="clc") Opcode="F8";
            if (Befehl=="") Opcode="";
    
            if(Eingabe[Zaehler]==' ')
            {
            	Zaehler++;
    
            	while(!(Eingabe[Zaehler]==',' || Eingabe[Zaehler]=='\0'))
            	{
            		Operant[0][Zaehler]=Eingabe[Zaehler];
            		Zaehler++;
            	}
            }
    
    		cout << "Der Opcode ist: 0x" << Opcode.c_str() << endl;
            cout << "noch einmal?: ";
            getline(cin, Eingabe);
    
            if(Eingabe=="nein") break;
        }
    }
    

    Ich starte das Programm und gebe bei der ersten Eingabeaufforderung "cli" ein.
    Bei der ersten Ausgabe wird dann

    Der bisher eingegebene Befehl ist: cli
    

    ausgegeben aber als zweite Ausgabe wird

    Der Opcode ist: 0xcli
    

    ausgegeben.
    Erwartet hatte ich

    Der Opcode ist: 0xFA
    

    Was läuft da falsch?

    Danke schon mal.



  • zeile 26 ist ub, du greifst auf speicher zu den du nicht reserviert hast. schau dir vll. push_back an.



  • Jo, danke noch mal.
    Jetzt, wo du es sagst.
    Ich hätte da wohl

    Befehl.append(Eingabe[Zaehler]);
    

    machen sollen.

    Werde das gleich mal probieren.



  • OK, append war wohl falsch push_back gibt es also auch bei Strings



  • Ich habe gleich mal noch ne andere Frage: Warum gibt es die trim()-Methode für Strings nicht obwohl es eine wichtige Funktion ist?

    Habe es

    Eingabe.trim()
    

    auskommentiert, weil es zum Compilerfehler führte.



  • ugoessner schrieb:

    Ich habe gleich mal noch ne andere Frage: Warum gibt es die trim()-Methode für Strings nicht obwohl es eine wichtige Funktion ist?

    Weil std::string broken ist.
    Die eine Hälfte der Funktionen will Iteratoren, die andere Indices. Viel zu viele Funktionen in einer Klasse, etc.
    Für trim gibts hier was: http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring



  • ugoessner schrieb:

    Ich habe gleich mal noch ne andere Frage: Warum gibt es die trim()-Methode für Strings nicht obwohl es eine wichtige Funktion ist?

    1. Weil das keine wichtige Funktion ist.
    2. Weil die von dir vorgeschlagene Schnittstelle (vermutlich void std::string::trim() ) keine effiziente Implementation ermöglicht. Wenn das erste Zeichen weggeschnitten wird, muss entweder der gesamte String nach vorne kopiert werden oder es muss pro std::string ein Offset gespeichert werden.
    3. Weil man sich einigen müsste welche Zeichen denn genau abgeschnitten werden.



  • ugoessner schrieb:

    Warum gibt es die trim()-Methode für Strings nicht obwohl es eine wichtige Funktion ist?

    Wenn die Frage ist, warum es sie nicht gibt, ist die Antwort: Weil sie damals, als die Standardbibliothek geschrieben wurde, niemand eingebaut hat.

    Wenn die Frage ist, warum sie aus moderner Sicht nicht da drin sein sollte: Weil sie mit dem bestehenden Interface leicht zu implementieren ist und daher keinen Zugriff auf die privaten Member des Strings braucht (ohnehin hat std::string viel zu viele Methoden). Eine Implementation als freie Funktionsvorlage gibt es in Boost.StringAlgo. Ob daraus mal std::trim werden wird, kann ich dir nicht sagen.


Anmelden zum Antworten