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 dannDer bisher eingegebene Befehl ist: cliausgegeben aber als zweite Ausgabe wird
Der Opcode ist: 0xcliausgegeben.
Erwartet hatte ichDer Opcode ist: 0xFAWas 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 wohlBefehl.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 (vermutlichvoid 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 prostd::stringein 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.