C++ String umgekehrt ausgeben

Watermelon

Cadet 1st Year
Registriert
Nov. 2018
Beiträge
10
Hallöle,

EDIT: ich bin Anfänger und kann nur Schleifen und Strings (getline ginge auch) benutzen.

leider finde ich nicht herraus wie ich dem Programm sagen soll, dass er beim Drücken von Enter nach der Schleife weiter macht.

Aufgabe: (Schleife, Strings)
Schreiben Sie ein C++ Programm, welches einen einzeiligen Text vom Benutzer einliest und diesen dann umgekehrt (von hinten nach vorne) ausgibt. Es seien auch Leerzeichen in der Eingabe erlaubt. Die leere Eingabe (Benutzer drückt sofort ENTER / RETURN) sei nicht erlaubt. Der Benutzer mache nur korrekte Eingaben.

Variante 1 mit der ich es versucht habe :
C++:
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string text = ""; int position = 0, buchstabe = 0;
    cout << "Bitte einzeiligen Text eingeben (ohne Leerzeichen): ";
    cin >> text;


    for (int position = 0; position < text.length() , text.length() != 0; position++)
//muss ich getline benutzen?
    {
            cout << "Position: " << position << " Buchstabe: " << text.at(position) << endl;
    }


    system("PAUSE");
    return 0;
}

Variante 2:
C++:
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string text = ""; int position = 0, buchstabe = 0;
    cout << "Bitte einzeiligen Text eingeben (ohne Leerzeichen): ";
    cin >> text;


    for (int position = 0 ; position < text.length() , /*nur ausführen wenn die erste Eingabe kein Enter ist
(also char(10)??) */ text.at(0) != char (10); position++)
    {
      cout << "Position: " << position << " Buchstabe: " << text.at(position) << endl;
    }


    system("PAUSE");
    return 0;
}

Grüße
 
Zuletzt bearbeitet:
Ich bin in C zwar gerade nicht mehr ganz drin, aber warum lässt du die Schleife nicht einfach rückwärts laufen??
Dann könntest du die Schleife einfach rückwärts laufen lassen:
C++:
for (int position = text.length(); position == 0; --position) {
    cout << text.at(position);
}
 
Renegade334 schrieb:
Ich bin in C zwar gerade nicht mehr ganz drin, aber warum lässt du die Schleife nicht einfach rückwärts laufen??
Dann könntest du die Schleife einfach rückwärts laufen lassen:
C++:
for (int position = text.length(); position == 0; --position) {
    cout << text.at(position);
}

würde das das Problem mit der unerlaubten Enter Eingabe lösen? Alles andere funktioniert ja wie es soll
Ergänzung ()

Kr1ller schrieb:
Hausaufgabenhilfe...

nein, es sind freiwillige Aufgaben für mein Studium… ich habe ja schon fast alles nur das mit dem Enter finde ich nicht herraus
 
Musst halt prüfen ob "Text" leer ist oder nicht
 
Nilson schrieb:
Musst halt prüfen ob "Text" leer ist oder nicht


ich verstehe nicht wieso das nicht die zweite Bedingung der for Schleife (1 Variante) schon prüft (text.length() != 0) ? wenn der "Text" leer ist, dann hat er ja die länge 0 und ich sage ja, dass er das nur ausführen soll wenn er nicht null ist
 
cin: ließt bis zum leerzeichen
getline: geht auch wenn die Eingabe leerzeichen enthält

steht aber sicherlich auch alles im MSDN.
Was nicht unbedingt im MSDN steht code forumtierung: jede Varaiblentype eine eigene Zeile, falls notwendig einen Kommentar dazu wozu die Variable dient. In dem Beispiel nicht notwendig.
 
Du solltest dir nochmals anschauen wie for Schleifen funktionieren und vor allem, was der comma operator macht, denn den verwendest du hier: for (int position = 0; position < text.length() , text.length() != 0; position++) und erwartest dir ein spezifisches Verhalten, welches dieser Operator nicht liefert. Solltest dir also überlegen was du wirklich ausdrücken willst und wie der Operator dafür heißt.

Edit:
Außerdem, wie @gaelic schon geschrieben hat, ist die sauberste Lösung einfach std::reverse zu verwenden, das macht genau das, was du haben willst.

Gruß
BlackMark
 
Wie schon gesagt wurde hier unbedingt std::getline benutzen.

Ansonsten, wenn das korrekte Beispiel von gaelic nicht erlaubt ist, Du aber die Schleife verstanden hast, kannst Du zur Abwechslung auch mal einen Stack benutzen ;)
C++:
#include <string>
#include <iostream>  
#include <stack>      
using namespace std;

int main()
{
string text;
cout << "Bitte einzeiligen Text eingeben (mit Leerzeichen): ";
getline(cin, text);
stack<char> s;
for (char& t : text)
     s.push(t);
while (!s.empty())  {
     cout << s.top();
     s.pop();
}
cout << endl;
return 0;
}
 
reverse dürfen wir noch nicht benutzen.
stack habe ich auch noch nie im code gesehen, dürfen wir also auch nicht verwenden :/
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Xenons
Wie wäre es den mit if zu prüfen ob etwas eingeben wurde und wenn ja den string in der for schleife mit -- von hinten nach vorn zu lesen?
 
  • Gefällt mir
Reaktionen: Renegade334 und Watermelon
Hatte ich auch dran gedacht...
Code:
int main()
{
    std::string text;
    std::cout << "text: ";
    std::getline ( std::cin, text );

    if ( !text.empty() )
    {
        for ( auto i = text.length(); i > 0; --i )
        {
            std::cout << text[ i -1 ];
        }
    }
    else
    {
        std::cout << "text is empty!";
    }
}
 
  • Gefällt mir
Reaktionen: Watermelon
Oder wenn es etwas "moderner" sein soll:
C++:
#include <iostream>
#include <iterator>

int main(int argc, char* argv[]) {
    std::string text = "";
    std::cout << "text: ";
    std::getline ( std::cin, text );

    std::copy(
        std::make_reverse_iterator(text.end()),
        std::make_reverse_iterator(text.begin()),
        std::ostream_iterator<const char>(std::cout));
}
 
@ModellbahnerTT @lemon03 vielen Dank, das mit text.empty() kannte ich gar nicht...aber ich denke wir dürfen das benutzen. Gibt es noch eine andere Möglichkeit um zu prüfen ob etwas eingegeben wurde?
 
@Kanibal Der String hat eh schon Reverse-Iteratoren. Ich wuerde ja auch @gaelic 's Loesung vorschlagen, aber wenn std::reverse nicht erlaubt ist, wuerde ich es so machen:

C++:
#include <iostream>
#include <string>

int main()
{
    auto s = std::string{""};
    std::cout << "Bitte Text eingeben: ";
    std::getline(std::cin, s);
    
    std::cout << "Umgekehrter Text: ";
    for (auto i = s.rbegin(); i != s.rend(); ++i)
        std::cout << *i;
        
    std::cout << std::endl;

    return 0;
}

Damit muss man auch nicht checken, ob der String leer ist.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: BlackMark
Zurück
Oben