chount letters and words in a string



  • hallo

    bin c++ neuling und habe hier einige schulübungen zu lösen.
    schlage mich grad mit den begriffen:
    string, stream, stringstream, ostream rum.
    bissher kanne ich nur den string. ich hab gelesen das streams sogenannte container sind.
    was bringt mir das? kann ich ein stream oder ein stringstream, sstream (unterschied?) also als zwischenspeicher für objekte anschauen?

    dann zur eigentlichen aufgabe:
    ich suche nach einer einfachen möglichkeit, die anzahl wörter und die anzahl buchstaben (ohne leerzeichen und spezialzeichen) auszugeben. viele lösungen die ich online gefunden habe, benutzen irgend eine art stream, in welchen sie wort für word reinschieben.

    kann mir jemand eine einfach lösung coden, die nicht auf expertenwissen aufbaut, dh sehr leicht verständlich ist?

    hier mein code:

    #include <string>
    #include <sstream>
    
    using namespace std;
    
    #ifndef CText_H_
    #define CText_H_
    
    class CText {
    	string text; //member
    
    public:
    	// constructors
    	CText(string text):text(""){
    	}
    	CText():text(""){
    	}
    	//methods
    	unsigned getWordCount(){
    
    		return 0;
    	}
    	unsigned getLetterCount(){
    
    		return 0;
    	}
    	bool cointains(string word){
    
    		return 0;
    	}
    	ostream& toStream(ostream& stream){
    
    	}
    
    };//endclass
    
    #endif
    
    #include <string>
    #include <sstream>
    #include <iostream>
    #include "CVector.h"
    #include "CText.h"
    
    using namespace std;
    
    int main(){
    
    	/******************
    	AUFGABE 1 - vector
    	*******************/
    	// member anlegen
    	CVector v1(1,2), v2(3,4);
    
    	// SP vector 1 vektor 2 
    	cout << "ScalarProduct:\n" << v1.scalarProduct(v2) << endl << endl;
    
    	// addition v1 v2
    	cout << "Addition:\n";
    	v1.add(v2).toStream(cout);
    	// da man einen vector nich cout << vector schieben kann den umweg über die methode toStream
    
    	/*****************
    	AUFGABE 2 - text
    	******************/
    
    	CText text("Der Betrunkene sagt, was der Nüchterne denkt.");
    	cout << "Anzahl Wörter:\n" << text.getWordCount() <<
    		"\n\nAnzahl Buchstaben:\n" << text.getLetterCount() 
    		<< endl << endl;
    
    	return 0;
    }
    


  • #include <string>
    #include <iostream>
    #include <sstream>
    #include <cctype>
    
    int main()
    {
    	// Umlaute sind in ASCII so nicht darstellbar!
    
    	std::string str = "Der Betrunkene sagt, was der Nuechterne denkt.";
    
    	std::stringstream strm(str);
    
    	std::string word;
    	int wordCount = 0;
    	int letterCount = 0;
    
    	while (strm >> word)
    	{
    		for (int i = 0; i < word.length(); ++i)
    			if (std::isalpha(word[i]))
    				++letterCount;
    
    		++wordCount;
    	}
    
    	std::cout << "Anzahl Wörter:\n" << wordCount << "\n\nAnzahl Buchstaben:\n" << letterCount << "\n" << std::endl;
    }
    


  • Hmm, wo anfangen...
    Schreibe kein C vor jede Klasse. Das ist nur schlecht lesbar und nicht nützlich.
    Header sollten keine namespaces einbringen, sonst zerstört man den Sinn von namespaces.
    Habt ihr zur Übung Strings und Vektoren gebaut? Es gibt da std::string, std::vector und so.
    Man kann sehr wohl nutzerdefinierte Typen in cout schieben:

    ostream& operator<<(ostream& os, const CVector &v){
        v.toStream(os); //hier könnte man auch os << v.daten oder so schreiben
        return os;
    }
    

    Hast du eine Definition was ein Wort ist? Wie viele Wörter hat "Hallo(-+# jij|oo"? Normalerweise legt man Trennzeichen fest, ", .?!" zum Beispiel. Man könnte dafür find_first_of benutzen, ungefähr so:

    auto s = "Der Betrunkene sagt, was der Nüchterne denkt.";
    auto trenner = ", .?!";
    auto pos = find_first_of(begin(s), end(s), begin(trenner), end(trenner));
    if (pos != end(s)) //wir haben was gefunden
        //mit pos als start nochmal suchen und treffer mitzählen
    

    ...Oder man nimmt die fertige Lösung von klö.



  • Ueber die while-Schleife kann man gern straiten, aber immer wenn ich sowas sehe, dann werde ich traurig:

    for (int i = 0; i < word.length(); ++i) 
        if (std::isalpha(word[i])) 
            ++letterCount;
    

    Da koennte man:

    letterCount += std::isalpha(word[i]);
    
    (for auto const& c: word) ...
    
    std::count_if
    

Anmelden zum Antworten