von string zu char buffer[1000]
-
if( std::string(eingabe) != "stop" )Ich würde aber auch gänzlich auf char-Arrays verzichten.
-
naja ... ich glaube nicht das ich das so einfach ersetzen kann.. da mein kompleter parser darauf ausgelegt ist.. ich muss mich nämlich mit dem parser char um char vorbewegen und analysieren.. kann den parser hier auch mal reinstellen.. nur is der nich besonders klein...
-
Char fuer char kannst du auch mit std::string machen. Entweder mit dem
[]-Operatoroder aber Iteratoren und dannbegin/endnutzen.EDIT: Siehe hier fuer die Memberfunktionen.
-
komm stell rein wir brauchen was zum
lachenkritisieren
-
okay.. iterrator hatte ich total vergessen...
guut.. das müsste so eigentlich auch gehen.. mal aber zur eigentlichen frage zurück... um mir auch ein umprogrammieren zu sparen.. kann ich den aus meinem string einfach ein char buffer machen? ist so realisierbar wie man ja auch sonst von short nach long kann und so?edit:
ernstl schrieb:
komm stell rein wir brauchen was zum
lachenkritisieren
heee
naja.. ich mach mal pastebin.. da ich grad nirgendswo einen spoiler finde und der code echt nich kurz ist..der war jetzt ech nicht ohne zu programmieren..

achja.. wenn mir jemand sagen kann warum mir visual studios das programm sofort beendet bei einem error trotz system("pause") bekommt ein lobi
-
Ja. Es gibt ne Memberfunktion c_str(), die dir ein char Pointer auf den String liefert, dann strcpy() verwenden.
-
Nathan schrieb:
Ja. Es gibt ne Memberfunktion c_str(), die dir ein char Pointer auf den String liefert, dann strcpy() verwenden.
Oder auf dem c_str() arbeiten, schließlich verändert der Parser die Eingabe doch nicht, oder? Warum ist die char[1000] überhaupt so wichtig? Das klingt merkwürdig speziell. Kommt der Parser nicht mit beliebigen Längen zurecht?
@TE: Ich denke, du solltest wirklich mal ein bisschen Code zeigen, das klingt so, als könnte man da mit nur sehr wenigen Änderungen sehr viel verbessern.
-
also ich sag mal ganz offen.. mir wäre es um einiges lieber eine beliebig lange eingabe zu haben.. hatte jetzt eben mal die 1000er char genommen weil... naja.. weil es irgendwie das einzigste war dass mir grad so eingefallen ist.. werde mal versuchen mit was dynamischerem zu arbeiten.. du sagst c_str()? kenn ich so garnicht.. werd mich mal ein bischen mehr drüber einlesen... aber danke

-
Für dynamisch lange Strings wurde std::string entwickelt, der wächst mit.
Und c_str() ist eine Memberfunktion von std::string.
-
okaay... habe jetzt mein char mit einem string ersetzt..
sieht jetzt so aus:
void Calculator::Run() { while(!cin.eof()) { getline(cin, term); position = 0; klammern = 0; cout << term << " = " << list() << endl; } }ansonsten habe ich nur jedes mal wo ich eben buffer hatte "term" hingeschrieben.. sonst nichts geändert..
das programm startet auch.. nur bekomme ich, sobald ich etwas korrektes eingebe (also etwas das nicht vorher von meinem "error-scanner" abgefangen wird) die meldung dass:
Expression: string subscript is out of range
-
Dann wirst du wohl entweder etwas falsch gemacht haben oder es war schon immer etwas falsch, aber beim string fällt es auf.
A propos falsch: Du liest schon falsch ein.
while(!cin.eof())ist Quatsch. Wo hast du das denn her? So merkst du doch erst, dass du beim getline ins Ende gelaufen bist, nachdem du die fehlerhaft gelesene Zeile verarbeitet hast.
-
SeppJ schrieb:
A propos falsch: Du liest schon falsch ein.
while(!cin.eof())ist Quatsch. Wo hast du das denn her? So merkst du doch erst, dass du beim getline ins Ende gelaufen bist, nachdem du die fehlerhaft gelesene Zeile verarbeitet hast.ja habe ich mittlerweile auch rauskommentiert.. die zeilen hatte ich mal wo anders gebraucht und hierfür einfach nur so übernommen..
naja.. prinzipiell kann ich aber schon bei einem string zb nur das 5te zeichen verwenden oder? also zb.
string name; cout << name[4] << endl;
-
gangstergangster schrieb:
SeppJ schrieb:
A propos falsch: Du liest schon falsch ein.
while(!cin.eof())ist Quatsch. Wo hast du das denn her? So merkst du doch erst, dass du beim getline ins Ende gelaufen bist, nachdem du die fehlerhaft gelesene Zeile verarbeitet hast.ja habe ich mittlerweile auch rauskommentiert.. die zeilen hatte ich mal wo anders gebraucht und hierfür einfach nur so übernommen..
Die sind immer falsch. Daher auch die Frage, wo du das her hast. Es gibt tatsächlich Bücher in denen so etwas steht! Oder auch Internettutorials, wobei die ohnehin einen eher schlechten Ruf haben. Jedenfalls ist es ein sicheres Zeichen, dass man das entsprechende Werk nie wieder benutzen sollte. Das ist kein Scherz oder Übertreibung! Der schlechteste Lehrer ist nicht der, bei dem man nichts lernt, sondern der, bei dem man Falsches lernt.
naja.. prinzipiell kann ich aber schon bei einem string zb nur das 5te zeichen verwenden oder? also zb.
string name; cout << name[4] << endl;Nein. Der String hat hier doch keine Länge und das 5. Zeichen von keinen Zeichen ist selbstverständlich keine gültige Positionsangabe. Was sollte da denn rauskommen?
Vielleicht mal ein gutes Buch besorgen? Das sind beides Fehler die auf sehr schlechtes Lehrmaterial hindeuten. Siehe Links in meiner Signatur. Da einige der guten Bücher sogar gratis sind (Thinking in C++) kann es keine Ausrede geben, das schlechte Material weiter zu benutzen.
-
SeppJ schrieb:
gangstergangster schrieb:
SeppJ schrieb:
A propos falsch: Du liest schon falsch ein.
while(!cin.eof())ist Quatsch. Wo hast du das denn her? So merkst du doch erst, dass du beim getline ins Ende gelaufen bist, nachdem du die fehlerhaft gelesene Zeile verarbeitet hast.ja habe ich mittlerweile auch rauskommentiert.. die zeilen hatte ich mal wo anders gebraucht und hierfür einfach nur so übernommen..
Die sind immer falsch. Daher auch die Frage, wo du das her hast. Es gibt tatsächlich Bücher in denen so etwas steht! Oder auch Internettutorials, wobei die ohnehin einen eher schlechten Ruf haben. Jedenfalls ist es ein sicheres Zeichen, dass man das entsprechende Werk nie wieder benutzen sollte. Das ist kein Scherz oder Übertreibung! Der schlechteste Lehrer ist nicht der, bei dem man nichts lernt, sondern der, bei dem man Falsches lernt.
das hatte ich mal aus einem uraltem buch über das parsen in c++... damals zumindest gabs nichts besseres.. oder ich hatte nichts gefunden.. habe dann ne weile "cin.eof" gegooglet und mich mit einer halbwegs-antwort zufrieden gegeben... naja.. btt..
es ist spät und ich vergesse.... gemeint habe ich es natürlich so:
string name; name = "abcdefghijklmnopq"; cout << name[4] << endl;SeppJ schrieb:
Vielleicht mal ein gutes Buch besorgen? Das sind beides Fehler die auf sehr schlechtes Lehrmaterial hindeuten. Siehe Links in meiner Signatur. Da einige der guten Bücher sogar gratis sind (Thinking in C++) kann es keine Ausrede geben, das schlechte Material weiter zu benutzen.
ja mein c++ wissen setzt sich aus ab und zu mal besuchten tutorien/vorlesungen zum thema.. dann habe ich dass hier: http://goo.gl/3yEfK mal so zur hälfte durchgearbeitet .. und eben das buch zum parsen.. wobei das eher mathematisch anspruchsvoller war (und sich wie ein stück trockenes brot gelesen hatt. außerdem ist es von 98 :D)...
der rest setzt sich eben aus gegoogeltem zusammen...
ich danke trotzdem mal recht herzlich hier.. bin echt erstaunt wie schnell und vorallem wie gute antworten man hier bekommt! jedoch will ich jetzt nicht, dass jetzt jemand anderes mir mein zeug programmiert.. (wo bleibt mir da der spaß...)
und ich hoffe ich geh hier niemandem auf die nerven

-
Ich sehe gerade, ich sollte vielleicht mal zeigen, wie es richtig geht
:Lesen:
while(getline(zeile, stream)) { // zeile verarbeiten }Oder vergleichbare Muster. (Fast) alle Leseoperationen geben den Stream selbst zurück (sonst könnte man sie nicht verketten a la
cin >> a >> b;). Dieser ergibt bei Auswertung dann entweder true (alles in Ordnung) oder false (irgendetwas ist schief gelaufen (nicht nur Dateiende! So erwischt du alle Fehler)). Das muss natürlich nicht unbedingt eine while-Schleife sein und es muss auch nicht unbedingt getline sein, das ist bloß ein (gängiges) Beispiel.Strings:
gangstergangster schrieb:
es ist spät und ich vergesse.... gemeint habe ich es natürlich so:
string name; name = "abcdefghijklmnopq"; cout << name[4] << endl;So ist das voll in Ordnung und gibt dir ein 'e'.
P.S.: Noch ein paar Kleinigkeiten, die du wahrscheinlich falsch aus dem Buch hast (1998?
. Galileo-Verlag?
.):string name = "abcdefghijklmnopq"; // Gleich richtig initialisieren cout << name[4] << '\n'; // Du möchtest den Stream wahrscheinlich gar nicht flush'enhttp://www.cplusplus.com/reference/ostream/endl/
http://www.cplusplus.com/reference/ostream/flush-free/