Anzahl der eingegebenen Wörter ermitteln
-
das problem ist, das cin selber mit enter abschließt und du so niemals ein
enter einfängst.du musst die ganze zeile einlesen und zwar mit geline
da du noch am anfang stehst musst du mit strings nicht umlernen, also nimm sie,
sie haben sehr viele vorteile#include <iostream> #include <conio.h> #include <ctype.h> #include <string> // hier kommt der neue datentyp using namespace std; // string liegt auch im namespace std ! int main() { string eingabe; // <-- hier ist er ! int words = 0; // achtung !! wenn man der variable keinen wert zuweist // dann hat sie einen zufälligen !! z.b. -8465263 cout << "Geben Sie einen beliebig langen Text ein. Durch druecken von [ENTER] beenden Sie die Texteingabe.\n\n"; getline(cin, eingabe); // wir lesen von cin in den string for (unsigned i = 0; i < string.length(); ++i) // jeden buchstaben durchgehen if (eingabe[i] == ' ') // wenn das ein leerzeichen ist.. ++words; // ++words ist ein tick schneller als words++ cout << "\n\nIhr Text besteht aus " << words + 1<< " Woertern.\n\nZum Beenden des Programms [ENTER] druecken..."; // words + 1 weil: "hallo welt" sind 2 wörter aber nur eine leertaste getch(); }allerdings klappt das nur, wenn man mindestens ein wort eingibt und immer nur eine leertaste benutzt
mfg helferlein
-
nein mist fehler
for (unsigned i = 0; i < string.length(); ++i)heißt natürlich
for (unsigned i = 0; i < eingabe.length(); ++i)
-
++words; // ++words ist ein tick schneller als words++
Muahaha

Wie geil. Und wie falsch.
-
hustbaer schrieb:
++words; // ++words ist ein tick schneller als words++
Muahaha

Wie geil. Und wie falsch.[] Du hast Ahnung.
-
Als Anmerkung würde ich auch noch sagen, das ich words direkt mit 1 inititalisieren würde anstatt dann bei der Ausgabe noch 1 zu addieren, wenn das in nem größeren Programm dann mal öfter vorkommt sieht man irgendwann nicht mehr durch, warum in der Variable die falsche Anzahl drinsteht, wobei es auch schon in dem Programm wenig Sinn macht.
MfG
-
würde ich nicht machen, weil es ja auch passieren kann, dass man 0 wörter hat...
words++; //sollte genau so schnell sein, wie ++words; //weil der compiler es wegoptimieren können sollte - erst bei größeren datentypen geht das nicht mehr so einfach glaub ich ^^ich habs ma bissl verändert...
helferlein schrieb:
std::vector <std::string> no_word_chars; chars.push_back (' '); chars.push_back ('.'); /*usw*/ chars.push_back ('?'); /*siehe helferlein*/ getline(cin, eingabe); if (!eingabe.empty ()) //eigtl nur der übersicht halber - sollte nicht benötigt werden... { bool word_is_count (false); for (std::string::const_iterator iter (string.begin ()), end (string.end ()); ++iter) { if (std::find (now_word_chars.begin (), now_word_chars.end (), *iter) { word_is_count = false; } else { if (!word_is_count) { ++words; word_is_count = true; } } } cout << "\n\nIhr Text besteht aus " << words << " Woertern.\n\nZum Beenden des Programms [ENTER] druecken...";sollte so gehen, wenn ich keinen denkfehler hab ^^
bb
-
Vielleicht sollte man auch anmerken dass der Code nicht die Worte zählt sondern die Leerzeichen (plus 1). Für mich zumindest ist
"a b"ein String mit 2 Worten und nicht 4.
Und" a "ist auch ein String mit einem Wort und nicht 3.
EDIT: ich hatte das Posting von unskilled um 01:15:13 26.08.2008 noch nicht gelesen, und beziehe mich auf den davor geposteten Code.
-
Eine weitere Alternative:
string temp = ""; getline(cin, temp); vector<string> words; istringstream sstr(temp); while( sstr >> temp ) words.push_back(temp); cout << words.size() << endl;
-
@unskilled:
Es hängt nicht so sehr von der Grösse des Datentyps ab, sondern eher davon wie die beiden operator ++ implementiert sind. Und bei eingebauten Typen wie int ist es eben wurscht.----
Ich habe auch nix dagegen wenn jmd. anmerkt man solle sich allgemein angewöhnen ++i statt i++ zu schreiben (wenn man den Returnwert nicht braucht), da man dann weniger leicht "vergisst" die pre-increment Version zu schreiben wenn man z.B. mal mit Iteratoren zu tun hat. Aber wenn jemand Code postet wo er einen "int" mit ++i hochzählt und noch ein Kommentar dazuschreibt ala "weils schneller ist", dann kann ich nicht anders als mich ein wenig zu zerkugeln und gleichzeitig ein wenig zu ärgern.
Vor allem wenn man sich mal etwas umsieht wieviel Mist dazu im Netz geschrieben wird. Ganz davon abgesehen dass jeder an premature-micro-optimization verschwendete Gedanke ... naja, eben verschwendet ist.
-
Vielen Dank an Euch alle!
Habe bei weitem nicht mit sooo vielen Antworten gerechnet. Und auch nicht damit, dass mein Code dermaßen danebenlag...
Die Aufgabe habe ich mit den Kenntnissen, die ich mir in dem Kapitel des Buchs "C++ Das Grundlagenbuch" aneignen sollte/wollte versucht zu lösen. Sogar bei der Aufgabenstellung wurde auf die Benutzung des "isspace()"-Befehls hingewiesen, weswegen ich genau diesen auch verwenden wollte. Eine simple, wenn auch möglicherweise längere Lösung mit eben diesem Befehl gibt es also nicht? Zwar scheint mir die Vorgehensweise von helferlein (danke nochmal) meiner in gewisser Weise ähnlich, doch auch er verwendet diesen Befehl nicht...
Und das mit dem Compiler: Bisher gefiel mir der von mir verwendete in sofern gut, als dass man sich bei ihm (bisher zumindest) nicht durch überfüllte Menüs kämpfen muss, sondern mit den Kenntnissen, die ich habe (ehem... oder eben auch nicht), sofort loslegen kann. Werde mir aber auf Euren Rat dennoch vornehmen, mit aktuellerer Software zu arbeiten.
-Dank und Gruß, Paiam