2016-05-09 10 views
-1

Ich möchte, dass meine Zeichenkette Reihenfolge nach Worten umkehrt. Wenn die Zeichenfolge "Cat is running" lautet, sollte "running is Cat" lauten. Hier ist der Code:Wie man die Reihenfolge der Wörter in einer Zeichenkette durch Rekursion umkehrt

#include<iostream> 
#include<string> 

using namespace std; 
void reverseString(string str); 
int length, lastLength; 

int main() { 

    string s; 
    cout << "Enter a string to reverse its words: "; 
    getline(cin, s); 
    lastLength = s.length() - 1; 
    length = lastLength; 
    cout << "\nThe string in reverse order is "; 
    cout << endl; 
} 

void reverseString(string str) { 

    if (length < 0) 
     return; 
    else { 
     if (str.at[length] == " " || length == 0) 
     { 
      if (length == 0) 
       length = -1; 
      for (int i = length + 1; i < lastLength; i++) 
       cout << str.at[length]; 
      lastLength = length - 1; 
     } 
     length--; 
     reverseString(str); 
    } 
} 

es einige Fehler der Zeiger und Array zeigt. Ich weiß nicht, wie ich das lösen soll. Jede Hilfe wird wirklich geschätzt! :)

+1

ist es ein Übersetzungsfehler oder Laufzeitfehler oder falsche Ausgabe, Bitte klären Sie!! Ich sehe 'reverseString' nicht in main. – piyushj

+0

Ich würde vermeiden, globale Variablen in der Rekursion zu verwenden, sie machen den Code ziemlich schwer zu lesen/zu analysieren. –

+0

Ihre Schleifeninvariante und ihr Körper sind falsch. Überprüfen Sie, was Sie damit erreichen möchten. –

Antwort

0

Sie haben zwei verschiedene Fehler. .at ist eine Methode, so sollte es als .at() nicht .at[] aufgerufen werden. Zweitens vergleichen Sie char mit string (""). Sie sollten also "" durch "" ersetzen.

#include<iostream> 
#include<string> 

using namespace std; 
void reverseString(string str); 
int length, lastLength; 

int main() { 

    string s; 
    cout << "Enter a string to reverse its words: "; 
    getline(cin, s); 
    lastLength = s.length() - 1; 
    length = lastLength; 
    cout << "\nThe string in reverse order is "; 
    cout << endl; 
} 

void reverseString(string str) { 

    if (length < 0) 
     return; 
    else { 
     if (str.at(length) == ' ' || length == 0) // <- note the changes here 
     { 
      if (length == 0) 
       length = -1; 
      for (int i = length + 1; i < lastLength; i++) 
       cout << str.at(length); // <- note the changes here 
      lastLength = length - 1; 
     } 
     length--; 
     reverseString(str); 
    } 
} 

Ich habe die Logik nicht überprüft. Sie können weiterhin auf die Logik arbeitet :)

+0

Ich habe den Fehler erhalten. Es ist ernsthaft unreif. Wie Ihre Methode .. :) –

0

std::string viele Helferfunktionen, wie string::find, string::rfind und std::substr, die Sie verwenden können, um die Zeichenfolge zu manipulieren, anstatt die Zeichen für den Zugriff auf individuell. Zum Beispiel:

void reverseString(std::string str, size_t end) 
{ 
    size_t pos = str.rfind(' ', end); 
    if (pos == std::string::npos) 
    { 
     cout << str.substr(0, end + 1) << endl; 
    } 
    else 
    { 
     cout << str.substr(pos + 1, end - pos) << endl; 
     reverseString(str, pos - 1); 
    } 
} 

int main() 
{ 
    std::string s = "Enter a string to reverse its words"; 
    cout << s << endl; 
    reverseString(s, s.length()); 
} 
+0

** Sehr hilfreich ** –

0

Hier ist eine Version, die die Logik in Ihrer Lösung mit nur wenig C++ <string> Bequemlichkeit zu bewahren versucht:

void output_reverse_string(string str, int last, int current) { 
    /* Terminating condition: we've exhausted the input: */ 
    if (current == 0) { 
     std::cout << str.substr(current, 1 + last - current); 
     return; 
    } 
    /* Recurse until we've found a space: */ 
    if (str.at(current) != ' ') { 
     output_reverse_string(str, last, current - 1); 
     return; 
    } 
    /* Since we've found a space, output the following word: */ 
    std::cout << str.substr(current + 1, last - current); 
    /* Just for readability, can be skipped: */ 
    std::cout << " "; 

    /* Recurse on the *remaining* string contents: */ 
    output_reverse_string(str, current - 1, current - 1); 
} 
Verwandte Themen