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 🙂


Anmelden zum Antworten