Hallo,
bin mit dem String durcheinander gekommen. Idee ist, über Konsole werden
ganze Zahlen eingetippt, daraus soll eine gerade und ungerade Summe
gebildet werden, hier ein Ausschnitt;
1
// *ptrToArray - pointer to the data array
2
// arrayLength - length of the array
3
// vector - contains indices of the array with value of space '32'
Dein tempString hat immer Länge 0, weil du ihn nie vergrößerst bzw. eine
Größe an den Konstruktor übergibst. Die Zugriffe tempString[i] sind
somit Out-Of-Bounds-Fehler.
Michael S. schrieb:> Problem was ich habe ist, dass anscheinend mein tempString nicht immer> komplett gelöscht wird
Ja, nicht nur.
Problem ist, dass du völlig am schwimmen bist bei deiner Hausaufgabe.
Nett auch der nutzlos mitgeführte vector.
Da ist das Reingrätschen in tempString ja noch harmlos.
Mach halt den Programmierkurs nochmal, bisher hast du nicht verstanden,
wie man programmiert.
Du kannst nicht auf das i'te Zeichen eines leeren Strings zugreifen.
1
tempString.push_back(ptrToArray[y]);
wäre eine gültige Methode. Viele STLs haben eine Möglichkeit, solche
Fehler zur Laufzeit zu erkennen. Guck mal, welche Möglichkeiten Dein
Compiler hat. Das würde Dir eine Menge Zeit sparen.
Namen, wie `ptrToArray` haben kaum Informationen, weil nur der Typ im
Namen kodiert ist, aber nicht der Zweck / Rolle des Parameters.
danke für eure Inputs, dass mit dem push_back hat jetzt funktioniert.
Ich dachte eigentlich, da ich die einzelnen String Elemente mit
string[index] ausgeben kann, dann könnte ich ja auch die Daten genau so
rein schreiben.
Michael S. schrieb:> danke für eure Inputs, dass mit dem push_back hat jetzt funktioniert.> Ich dachte eigentlich, da ich die einzelnen String Elemente mit> string[index] ausgeben kann, dann könnte ich ja auch die Daten genau so> rein schreiben.
Du kannst mit dem Index-Operator auf vorhandene Elemente der
Zeichenkette zugreifen. Wenn die Zeichenkette leer ist, dann geht das
dem entsprechend nicht:
https://en.cppreference.com/w/cpp/string/basic_string
Hallo Michael,
eigentlich wollte ich nach dem Fehler suchen, aber da ist ja einiges
recht merkwürdig. Irgendwie ein bischen C, ein bischen C++ und viele
Ungereimtheiten bzw. Dinge, deren Sinn ich nicht ganz verstehe. Unten
ein Vorschlag (einfaches C++17 ohne Schnickschnack und Fehlerprüfung).
Die Ausgabe selbst habe ich mal aus der Funktion rausgenommen.
Michael S. schrieb:> was passiert hier, werden die Zahlen direkt aus dem String im Vector als> int abgelegt ?
der Vector hat einen Konstruktor mit zwei Iteratoren, d.h. der Vektor
wird mit den von den Iteratoren gelieferten Werten aufgebaut.
der begin-Iterator ist ein istream-iterator, der integer-Werte aus dem
input-stream liest.
der end-Iterator ist der generische "eof"-Iterator dazu.
d.H. der vector wird mit allen aus dem sstream lesbaren integern
befüllt.
Wenn man das noch optimieren mag, das Zwischenspeichern im vektor ist
eigentlich unnötig, die odd/even-Schleife könnte auch direkt über den
istream_iterator<int> laufen.
Michael S. schrieb:> was passiert hier, werden die Zahlen direkt aus dem String im Vector als> int abgelegt ?
Ja. Es gibt aber noch unzählige andere Methoden, einen solchen String zu
splitten/parsen und die Werte in einem Container (wie hier std::vector)
abzulegen, von C-Style bis zu STL-Kunststücken und Bibliotheken wie
Boost. Die Vorgehensweise mit einem String-Stream ist eben einfach - und
man benötigt keine expliziten Schleifen. Dabei werden eigentlich zwei
Dinge genutzt: Erstens, dass man mit std::stringstream mit einem String
wie mit einem Stream arbeiten kann, zweitens, dass einer der
Konstruktoren von std::vector ein Start- und End-Iterator-Paar
entgegennimmt (unten "first" und "last", der Allocator ist optional, den
kannst du ignorieren).
1
template<class InputIt>
2
vector(InputIt first, InputIt last, const Allocator& alloc = Allocator());
Wenn man das von Hand aufdröselt, ohne den speziellen Konstruktor von
std::vector zu benutzen, sieht es in etwa so aus:
1
std::vector<int> numbers;
2
3
std::istream_iterator<int> start_it(ss);
4
std::istream_iterator<int> end_it;
5
6
for(auto it = start_it; it != end_it; ++it)
7
{
8
numbers.emplace_back(*it);
9
}
Den Vektor brauchen wir eigentlich nicht ...
1
for(auto it = start_it; it != end_it; ++it)
2
{
3
if(*it % 2 == 0)
4
evenSum += *it;
5
else
6
oddSum += *it;
7
}
Wenn Du
1
std::istream_iterator<int> start_it(ss);
durch
1
std::istream_iterator<int> start_it(std::cin);
ersetzt, wird statt des String-Streams der Standard-Inputstream
verwendet; du kannst dann in der Konsole die Werte eingeben (Beenden der
Eingabe mit Ctrl-Z + Enter bzw. Ctrl-D + Enter - oder einfach
irgendeinen Buchstaben eingeben + Enter).
Noch eine Möglichkeit, die Werte in einen std::vector zu bekommen, wäre
1
std::copy(std::istream_iterator<int>{ss}, {}, std::back_inserter(numbers)); // zu {} siehe unten
BTW:
Du solltest noch
1
#include <iterator>
oben einfügen.
Auch kann man in meinem Beispiel ein wenig abkürzen:
Ich habe nicht gesehen, dass Εrnst B. schon geantwortet hatte (man
sollte vielleicht nicht auf den Antwort-Button klicken und dann erst
frühstücken :)).