C++ Drucken einer Zeichenfolge in umgekehrter mithilfe einer for-Schleife
Ich habe ein Programm, das druckt die Zeichen einer Zeichenfolge mit einer for-Schleife. Es muss auch drucken die gleichen Zeichen in umgekehrter, das ist, wo ich Probleme. Kann jemand mir helfen herauszufinden, warum die die zweite for-Schleife nicht ausgeführt wird?
int main()
{
string myAnimal;
cout << "Please enter the name of your favorite animal.\n";
cin >> myAnimal;
//This loop works fine
int i;
for(i = 0; i < myAnimal.length(); i++){
cout << myAnimal.at(i) << endl;
}
//This one isn't executing
for(i = myAnimal.length(); i > -1; i--){
cout << myAnimal.at(i) << endl;
}
return 0;
}
Sie sollten nicht mit int zu speichern, die Länge der Zeichenfolge die Länge der Zeichenfolge überschreitet den integer-Bereich.
InformationsquelleAutor Bobby | 2014-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weisen Sie ich zunächst auf die Länge minus eins, oder der Letzte index-Wert in das array.
Das war es, vielen Dank!
wenn Sie fand diese Antwort hilfreich, sollten Sie akzeptieren der Antwort.
InformationsquelleAutor Lokno
Da die Zeichen-Positionen starten bei 0, das Letzte Zeichen der
myAnimal
an position(myAnimal.length()-1)
nichtmyAnimal.length()
so dass Sie wollen, starten Sie die zweite Schleife gibt.InformationsquelleAutor moonshadow
@Lokno Ihnen schon die richtige Antwort. Lassen Sie mich allerdings auch Fehler Ihren code ein bisschen mehr, Ihnen zu zeigen, einige andere alternativen und zu beheben einige kleinere Fehler.
Erste, du hast nicht wirklich ein post kompilieren Beispiel, weil Sie vergessen haben, zeigen die enthaltenen Header
<iostream>
und<string>
und auch nicht zeigen, dieusing namespace std;
das war implizit in Ihrem code.Zweite, für die regelmäßige
for
Schleife, halten lieber die loop-variable innerhalb der Schleife, es sei denn, Sie wirklich brauchen, verwenden Sie es als einen Wert zurück. Auch lieber pre-Inkrement++i
über post-Inkrementi++
. Darüber hinaus, weil Sie gemacht haben, sicher, dass die richtigen loop-Indizes, es gibt keinen Grund, die Grenzen-geprüft-element zugreifenat()
über die ungeprüften[]
version.In C++11 haben Sie die range-for Schleife, die ermöglicht, auch die kürzeren und mehr narrensicher code, wo ich auch
auto
wo Sie benutzt haben könntechar
. Leider gibt es keine reverse range-for Schleife. Die richtige index-basierte reverse for-Schleife ist wahrscheinlich einfacher zu Lesen, wenn Siei >= 0
eher alsi > -1
.Dann gibt es einen Algorithmus, basierend Schleife mit
std::copy
wo Sie die Verwendung der iterator-Schnittstellestd::string
(insbesondere die reverse-Iteratorenrbegin()
undrend()
) zum kopieren von einzelnen Zeichen durch einostream_iterator
gebunden standard-Ausgabe.BTW, ich benutzte den separator
"|"
anstatt die neue zu sehen, Sachen, die einfacher sind, anpassen, um Ihrem Geschmack. In jedem Fall, mitstd::endl
können Auswirkungen auf die Leistung, weil es leert den Ausgabe-Puffer zu jeder Zeit.Live Beispiel. PS:
main()
implizit zurück0
auf Erfolg.InformationsquelleAutor TemplateRex
Könnten Sie reverse-Iteratoren
Beachten Sie, dass Sie haben, erhöhen Sie die variable " c " (und nicht abnehmen), da dies ist ein reverse-iterator.
InformationsquelleAutor Gautham
dies nicht tun. Holen Sie sich den Wert und werfen Sie es dann Weg.
Meinst du
i = myAnimal.length() - 1
?InformationsquelleAutor Karoly Horvath
Statt
schreiben
In Ihrem code, den Sie versuchen, Zugriff auf ein element des Strings ist außerhalb des zulässigen Bereichs, ist gleich [0, length() - 1]
Auch anstelle des Typs int ist es besser, verwenden Sie die type, std::string bietet für den Rückgabetyp der Funktion Mitglied der Länge, die std::string::size_type.
cout
Betrieb ist clever, wird aber allgemein als schlechter Stil.Ich denke dieser code ist mehr verwirrend für Anfänger.
InformationsquelleAutor Vlad from Moscow