Verständnis Frage
-
Wenn ich folgenden Code das erstemal starte wird das erste Zeichen verschluckt
woran liegt das?#include <iostream> #include <string> using namespace std; void zaehlziffern(string s){ cout <<"Der String hat "<<s.size()<<" Zeichen"; }; void toupperstring(string s){ cout <<s<<endl; for(unsigned int i=0;i<s.size();++i){ s[i]=toupper(s[i]); cout <<s[i]; } }; int main() { char frage='w'; string s=""; do{ cout <<"Bitte Text eingeben: "; cin.ignore(); getline(cin,s); zaehlziffern(s); cout <<endl; toupperstring(s); cout <<endl; cout <<"e=ende, w=weiter "; cin >>frage; }while(frage !='e'); }
-
Das liegt an dem ignore()-Aufruf, den du an den Anfang der Schleife gesetzt hast. (ignore() greift sich ein Zeichen aus dem Eingabepuffer und entsorgt es - das brauchst du nur, wenn du vor einem getline()-Aufruf vermutest, daß noch Reste früherer Eingaben im Tastaturpuffer zurückgeblieben sind)
-
Bie folgenden Code das selbe Problem aber ohne ignore()
#include <iostream> #include <string> using namespace std; void verdreher(string s) { unsigned int x = s.size(); for(x;x>0;--x) { cout <<s[x]; } } int main() { string s; char a; cout <<"Bitte ein String eingeben: "; getline(cin,s); verdreher(s); cin >>a; }
-
Das letzte Element in Deinem String ist an der Position size()-1, weil das erste Element bei 0 anfängt. D.h. x muss mit size()-1 initialisiert werden.
Dann ist Deine Abbruch-Bedingung in der For-Schleife nicht ganz richtig.
Wenn x = 0 ist, dann muss die Schleife auch noch ausgeführt werden.
Wenn Du aber als Bedingung x >= 0 machst, bekommst Du ne endlosschleife, weil x unsigned ist.einfacher könnte es so gehen:
#include <algorithm> // für std::reverse ... void verdreher(string s) { std::reverse(s.begin(), s.end()); // dreht den inhalt des strings um cout << s; } ...
-
vielen Dank.
-
#include <iostream> #include <string> void reverse_show(const std::string& string, std::ostream& stream) { for (std::size_t pos = string.length(); pos > 0; --pos) stream << string.at(pos - 1); } int main() { std::cout << "String: " << std::flush; std::string string; std::getline(std::cin, string); reverse_show(string, std::cout); std::cin.get(); }... um bei deinem Code zu bleiben ...
getline(cin,s); zaehlziffern(s); cout <<endl; toupperstring(s); cout <<endl; cout <<"e=ende, w=weiter ";... geht besser wenn du ne std. Funktion nimmst!
std::cout << "Text: " << std::flush; std::string text; std::getline(std::cin, text); length_show(text, std::cout); std::transform(text.begin(), text.end(), text.begin(), std::toupper); std::cout << "\n" << text << std::endl; std::cout << "(E)nde - (W)eiter" << std::endl;... viel Ordentlicher

Aja die nötigen Header:#include <algorithm> #include <cctype>... und um beim Muster zu bleiben:
void length_show(const std::string& string, std::ostream& stream) { stream << "Der String hat " << string.length() << " Zeichen!"; }...
so das mal als Verbesserungsvorschlag
