ne kleine frage zu nem c++ codeteil (strings)
-
hallo,
ich hatte jetzt keine lust lange danach zu suchen und vor allem wusste ich nicht wonach ich genau suchen sollte deswegen frage ich euch.ich hab c gelernt und hab jetzt ein c++ code vor mir an dem ich einen teil nicht verstenden habe
string eingabe; eingabe.reserve(50); cout << endl << "Your move (e.g. A1): " ; eingabe.erase(eingabe.begin(),eingabe.end()); cin >> eingabe; px = ((int) eingabe.at(0) ) - 65; py = ((int) eingabe.at(1) ) - 49;mein problem liegt dadrin dass ich nicht verstehe was das eingabe.reserve(50) bedeutet und damit verstehe ich alles nicht wo eingabe. steht. also vor allem diese zeilen:
eingabe.reserve(50); eingabe.erase(eingabe.begin(),eingabe.end()); px = ((int) eingabe.at(0) ) - 65; py = ((int) eingabe.at(1) ) - 49;danke

-
eingabe.reserve(50); eingabe.erase(eingabe.begin(),eingabe.end());Der Teil ist unnötig. Zuerst wird sichergestellt, dass Eingabe 50 Zeichen aufnehmen kann, ohne intern kopieren zu müssen. Dann wird alles in eingabe gelöscht. Die ganze Prozedur ist vollkommen sinnfrei, sofern hier nicht irgendwelche geheimnisvollen Nebeneffekte ausgenutzt werden sollen (und davon ist nichts zu erkennen).
Dieser Teil:
px = ((int) eingabe.at(0) ) - 65; py = ((int) eingabe.at(1) ) - 49;Hier wird erwartet, dass in eingabe Koordinaten wie bei Schach oder Schiffe versenken stehen, also z.B. A1, H4 oder B8. Dann wird vom ersten Zeichen (also dem Buchstaben) der ASCII Wert von A abgezogen, wodurch man 'A' zu 0 umrechnet und Z zu 25. Ebenso wird vom zweiten Zeichen (also der Zifffer) der ASCII Wert von '0' (dem Zeichen!) abgezogen, wodurch das Zeichen '0' zur Zahl 0 umgerechnet wird, ebenso alle Ziffern bis 9.
Der Cast ist dabei ebenfalls total unnötig, außerdem ist nirgendwo garantiert dass die Plattform ASCII-Zeichencodierung benutzt, ein simples eingabe.at(0)-'A' wäre deutlich besser gewesen.Das alles hinterlässt den Eindruck, dass der Programmierer dieser Zeilen nicht wirklich viel Ahnung hat. Du solltest in Zukunft Code von dieser Stelle mit Vorsicht genießen und erst Recht nicht zum Lernen benutzen. Zumindest nicht als Vorbild --- Du kannst einiges daraus lernen, warum dieser Code nicht gut ist.
-
SeppJ schrieb:
Die ganze Prozedur ist vollkommen sinnfrei, sofern hier nicht irgendwelche geheimnisvollen Nebeneffekte ausgenutzt werden sollen ...
Wahrscheinlich ist
eingabe.erase(eingabe.begin(), eingabe.end());eine 'Dekoration' für
memset(eingabe.CharDaten, '\0', sizeof(char));Das dekorierte 'new' in
eingabe.reserve(50);ist wahrscheinlich eher ein malloc() als ein calloc(). new ist sowieso nie ein calloc (und schon gar kein realloc).
Echt schlimm, was man in C++ alles nicht machen kann ...
Der Erfinder des sinnfreien Codes wollte (aus welchen Gründen auch immer) wohl nur sicher gehen,
dass die 'eiserne' 50-Byte-Reserve(50) ausgenullt wird, bevor damit weiter gearbeitet wird.
Der willkürliche und sinnverwirrende Bezeichnerwildwuchs in C++ kann dem gestandenen C-Programmierer (wie insbesondere den Themen-Starter)
wohl nur suspekt erscheinen.
Alles nur Dekorations-'Objekte' im Troll-Stil (speziell die C++ - std::string Teile), die nichts vereinfachen,
aber dafür umso umständlicher zu handhaben sind, je trivialer die Aufgabenstellung ist ...
-
Aber was ist die Aufgabenstellung? Es macht überhaupt keinen Sinn den reservierten Speicher auf 0 zu setzen, deswegen gibt es ja auch keine eingbaute Funktionalität dafür! Außerdem setzt erase noch nicht einmal den Speicher auf 0, sondern löscht bloß virtuell Zeichen (d.h. die internen Pointer des Strings werden umgesetzt). Was hier total sinnlos ist.
Um wirklich Werte zu verändern müsste man assign benutzen. Und auch dies macht keinen Sinn.
-
eingabe.reserve(50); eingabe.erase(eingabe.begin(),eingabe.end());Der Teil ist unnötig. Zuerst wird sichergestellt, dass Eingabe 50 Zeichen aufnehmen kann, ohne intern kopieren zu müssen. Dann wird alles in eingabe gelöscht. Die ganze Prozedur ist vollkommen sinnfrei, sofern hier nicht irgendwelche geheimnisvollen Nebeneffekte ausgenutzt werden sollen (und davon ist nichts zu erkennen).
Ich vermute mal dass jemand Probleme damit hatte, dass im Eingabebuffer noch Reste von vorherigen Eingaben standen. Durch das löschen von dem eingabe string hat er versucht das zu beheben.
Das funktioniert so aber nicht, google mal nach "Eingabebuffer cin leeren" oder so.