Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

29.03.2017, 04:56

std::stringstream "konvertiert" nicht richtig

Hi, ich bin gerade dabei ein paar Programmierübungen zu machen und es geht im Prinzip darum eine Zahl mit gerader Stellenzahl in zwei Hälften zu teilen und jeweils die Quersumme zu berechnen und zu vergleichen.
Da ich sowas normalerweise gerne arithmetisch löse, habe ich mich hier aber für einen String-Ansatz entschieden. Ich verwende stringstream um den Integer in einen String zu konvertieren und die Zeichen wieder zu einem Integer. Im Folgenden habe ich erstmal den Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
bool isLucky(int n) {   // n = 1230
    std::stringstream stream;
    stream << n; 
    std::string ns = stream.str(), part1, part2;            // ns := n als String
    part1 = ns.substr(0, ns.length() / 2);                  // Erste Hälfte
    part2 = ns.substr(ns.length() / 2, ns.length() / 2);    // Zweite Hälfte
    
    return (partialSum(part1) == partialSum(part2));
}

int partialSum(std::string part) {
    std::cout << part << std::endl;                         // Ausgabe: 12 30 korrekt
    std::stringstream stream;
    int partSum = 0;
    for(auto it = part.begin(); it != part.end(); it++) {
        std::cout << *it << std::endl;                       // Ausgabe: 1 2 3 0 korrekt
        stream << *it;
        int value = 0;
        stream >> value;
        std::cout << value << std::endl;                    // Ausgabe: 1 0 3 0 ??
        partSum += value;
    }
    return partSum;
}


Der Code ist entsprechend kommentiert, mit der Testeingabe und den Debug-Ausgaben versehen. Ich weiß dass ich die einzelnen Zeichen auch mit '0'-Subtraktion oder atoi konvertieren könnte, aber ich wollte einfach mal mit stringstreams arbeiten und die STL Klassen verwenden. Bei anderen Testeingaben verhält es sich auch so, dass bei jeder Hälfte nur die erste Ziffer korrekt "konvertiert" wird. Könnte mir jemand dieses Verhalten erklären?

Grüße

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

29.03.2017, 08:12

Du solltest den Stream leeren...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
int partialSum(std::string part) {
    std::cout << part << std::endl;
    int partSum = 0;
    for(auto it = part.begin(); it != part.end(); it++) {
        std::stringstream stream;
        stream << *it;
        int value = 0;
        stream >> value;
        std::cout << value << std::endl;
        partSum += value;
    }
    return partSum;
}
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »BlueCobold« (29.03.2017, 08:19)


birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

29.03.2017, 23:03

Ok danke, das funktionert, aber warum ist es nötig? Ich füge ja das nächste Zeichen ein bevor ich es lese. Oder ist es so, dass ich sobald ich zu lesen anfange nichts mehr reinschreiben kann?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

30.03.2017, 06:45

Nach dem ersten Lesen ist der Stream am Ende, womit good()==false. Wenn es false ist, tut "<<" nicht mehr wie gewünscht (siehe Doku). Setzt man das Flag mit clear() zurück, tut's auch. Allerdings kann ich mir dann diese Zeile auch schenken und stattdessen die Deklaration in die Schleife schieben.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (30.03.2017, 06:53)


birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

5

30.03.2017, 17:01

Danke dir, jetzt hab ich es auch verstanden, muss das in der Dokumentation übersehen haben.

Werbeanzeige