Du bist nicht angemeldet.

Werbeanzeige

1

14.02.2020, 19:34

Mit C++ und Strings einzelne Worte umkehren

Hallo.
Ich hätte eine Frage zu folgender Aufgabenstellung:
Es soll ein Programm geschrieben werden, das alle Wörter in einem String umkehrt.
Dabei sollen alle Leerzeichen berücksichtigt werden. Zum Beispiel:
Hallo du da ---> ollaH ud ad
Doppelter Leerschritt ---> retleppoD ttirhcsreeL
Bisher habe ich mir folgendes Überlegt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int main()
{
    string str = "Hallo du da"; // String der umgedreht werden soll
    string saveSpace; // speicher für leerschitt(e)
    string saveWord; // speichert wort das umgedreht werde soll
    string buffer; // gesamtspeicher für umgedrehten string

    for (int i=0; i < str.length(); i++) {
        if (str[i] == ' ') {
            // Wie bekomme ich hier die Indizes für die einzelnen Wörter?
        }
    }

    // Einzelne Wörter die umgedreht werden sollen
    saveWord = str.substr (0,5);
    reverse(saveWord.begin(), saveWord.end());

    
    // Danach einzelene wörter mit buffer.append() in den buffer kopieren

}


Ist mein Ansatz korrekt oder muss ich ganz anders vorgehen?

David Scherfgen

Administrator

Beiträge: 10 216

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

15.02.2020, 01:47

Du redest von Wörtern, aber eigentlich meinst du Buchstaben bzw. Zeichen, oder nicht?

3

15.02.2020, 11:44

Hatte lange weile. Meintest du das ungefähr so: http://cpp.sh/3k2db ?

4

17.02.2020, 18:11

Cool. Das ist genau das was ich meinte, Danke. Was bedeutet in Zeile 17 der Doppelpunkte?

Quellcode

1
for (char c : sentence)

5

17.02.2020, 19:13

Die Doppelpunkte "zerlegen" Arrays (und andere Datentypen, die eine Auflistung darstellen) sozusagen in ihre einzelnen Elemente und führen den Code im Schleifenkörper für jedes Element durch. Folgende Schleifen haben also, angenommen du hast ein int-Array numbers = { /* irgendwelche Zahlen */ }, die gleiche Funktion (jede Zahl wird in einer eigenen Zeile ausgegeben):

C-/C++-Quelltext

1
2
3
4
for (int i = 0; i < /* Länge des Arrays */; i++)
{
std::cout << numbers[i] << std::endl;
}


C-/C++-Quelltext

1
2
3
4
for (int number : numbers)
{
std::cout << number << std::endl;
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »lukasrad02« (17.02.2020, 19:19)


6

18.02.2020, 11:49

Ah, okay. Ein paar Fragen hätte ich da aber noch.

Quellcode

1
2
3
4
5
for (char c : sentence)
{
    if (c == ' ')
    ++wordCount;
}

Bei obigen Codeausschnitt müsste die Zahl der gezählten Worte doch viel größer
sein, wenn man mehrere Leerzeichen verwendet. Wie kann es sein dass, das trotzdem funktioniert?

Und Weiter:

Quellcode

1
2
3
4
5
6
7
    for (int i=0; i < wordCount; i++)
    {
        positionEnd = sentence.find_first_of (' ', positionStart);
        wordList.push_back(sentence.substr(positionStart, positionEnd - positionStart));

        positionStart = positionEnd + 1;
    }

Ich glaube so grob verstehe ich was dieser Codeabschnitt macht. "positionEnd" findet mit find_first_of das Ende des ersten
Wortes heraus weil man ja auf ' ' prüft. Dann wird das betreffende Wort in "wordList" verschoben das ja ein Vektor vom 'TypString ist. Aber warum muss man "positionEnd - positionStart" schreiben? Wird positonEnd dann nicht im zweiten durchlauf negativ?

Schorsch

Supermoderator

Beiträge: 5 189

Wohnort: Wickede

Beruf: Student

  • Private Nachricht senden

7

18.02.2020, 13:30

An sich solltest du noch mal versuchen selbst eine Lösung zu implementieren. Du musst lernen Probleme zu zerteilen. Dein Ziel ist es Wörter in einem Satz umzudrehen. Fang also erst mal mit einem einzelnen Wort an. Wenn das funktioniert nimmst du Leerzeichen mit auf. Nachdem das funktioniert solltest du eine Möglichkeit gefunden haben ein Wort umzudrehen bei welchem du Anfang und Ende kennst. Das sollte sich jetzt relativ einfach zu deiner eigentlichen Aufgabe erweitern lassen.
Fremden Code zu lesen und zu verstehen ist zwar wichtig, du solltest aber auch selbst viel entwickeln.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige