2017-03-21 5 views
-1

Ich sollte ein Programm schreiben, das nur die Wörter zeigt, die am Ende einen Großbuchstaben haben.Kann keinen Fehler finden. C++, Strings

Zum Beispiel: „Ein paar Worte nur genau dort“ -> „Ein paar Worte richtig“

Aber es ist etwas falsch mit meinem Code und ich kann keinen Fehler finden. (Sorry für diesen Code, könnte es wirklich vermasselt werden)

string LastUpperSymbol(string text) { 

    int i = 0, space, next, sortEl = 0; 
    string textcopy = text; 
    int size = textcopy.size(); 
    string sorted; 
    string alph = "abcdefghijklmnopqrstuvwxyz "; 
    if (textcopy[0] != alph[26]) { 
     space = text.find(" "); 
     if(isupper(textcopy[space-1])) { 
      sorted.append(textcopy, 0, space+1); 
     } 
     while(space < textcopy.size()) { 
      next = space+1; 
      space = text.find(" ", next); 
      if(space == -1) { 
       if(isupper(textcopy[size])) { 
        sorted.append(textcopy, next, textcopy[size]); 
       } 
       break; 
      } 
      else if(isupper(textcopy[space-1])) { 
       sorted.append(textcopy, next, space+1); 
      } 
     } 
    } 
    else { 
     //something 
    } 
    cout << sorted << endl; 
    return text; 
} 
int main() { 

    string text = "somE wordS just RighT there"; 
    cout << LastUpperSymbol(text); 
    system("PAUSE"); 
} 
+0

Es ist wahrscheinlich, dass Ihre Zeichenfolgenimplementierung ein Debug-Flag hat, das Sie verwenden können, um Dinge wie Out-of-Bounds-Prüfungen zu aktivieren, obwohl ich an andere Bibliotheksteile denken könnte. Wenn nichts anderes möglich ist, können Out-of-Bounds mit 'at' anstelle von '[]' laut gemacht werden. Sie können auch ein Sanitizer-Tool ausprobieren. – chris

+6

Mein Rat ist, zu lernen, wie Sie Ihren Debugger verwenden, um einen Schritt durch den Code zu gehen und Variablen bei jedem Schritt zu betrachten. – drescherjm

+2

Überprüfen Sie immer das Ergebnis von 'find', um sicherzustellen, dass es nicht' std :: string :: npos' ist. – NathanOliver

Antwort

1

Die Standardbibliothek bereits Code für die überwiegende Mehrheit von dem, was Sie hier tun müssen, bietet, es ist so wahrscheinlich einfacher zu benutzen, was es gibt statt versuchen, die Probleme in Ihrem vorhandenen Code herauszufinden.

Ich würde wahrscheinlich den Job so etwas tun:

std::string silly_filter(std::string const &in) { 

    std::istringstream buff(in); 
    std::ostringstream out; 

    std::copy_if(std::istream_iterator<std::string>(buff), 
     std::istream_iterator<std::string>(), 
     std::ostream_iterator<std::string>(out, " "), 
     [](std::string const &s) { 
      return ::isupper((unsigned char)*s.crbegin()); 
     }); 
    return out.str(); 
} 
0

Soweit ich das

else if(isupper(textcopy[space-1])) { sorted.append(textcopy, next, **space+1**); }

sehen

der Raum + 1 die Anzahl der String anhängen. Wenn also next = 5 wäre, wäre die Zeichenfolge w, so dass der zweite Parameter die Länge von "wordS" sein müsste, d. H. In diesem Fall wächst der zweite Parameter weiter.

Verwandte Themen