Bedingter Ausdruck
-
Warum geht dass nicht?
switch(string temp = (i < (words.size()-1) ? ([i] + words[i+1]) : 0))MfG
Stromberg
-
Was geht nicht? Was versuchst du zu erreichen?
switchkann nur im Zusammenhang mit integralen Typen verwendet werden.Und was soll das
[i]mitten im Ausdruck?
-
- switch klappt nur mit Ganzzahlen, du deklarierst da einen String.
- i scheint ein int-ähnliche Variable/Konstante zu sein, was soll "[i]" sein?
- Einen String kannst du nicht mit
(0)initialisieren.
-
1. "Geht nicht" ist keine Fehlerbeschreibung.
2. Du kannst keinstd::stringeinem Switch übergeben. Switch kann nur mit integralen Datentypen umgehen.Grüssli
-
Mh, jetzt hab ichs mal ohne switch probiert, und klappt au schön, aber in "temp" steht nur Kauderwelche obwohl eigentlich 2 Buchstaben oder " " drinstehen sollte.
if((temp = (i < (words.size()-1)) ? words[i] + words[i+1] : ' ')z.B. sowas: "╦¤Ê╬╩═¤╬╠"
MfG
Stromberg
-
Kannst du dich mal verständlich ausdrücken? Was willst du genau erreichen?
Was soll
tempsein, wie gibst du es aus?
-
Ich nehme mal an, dass temp der
std::stringist und words auch einstd::stringist, denn einstd::vector<std::string>oder ähnliches kann es nicht sein, da der Rückgabewert von Bedingtenanweisungen einheitlich sein muss. Dann ist aber wohl klar, dass dies nicht das gewünschte Ergebnis liefern wird:
words[i] + words[i+1]
Das ist eine Addition von char Werten. Das fügt die Dinger nicht zusammen.
Vielleicht solltest du dieses seltsame und hässliche Konstrukt auseinander nehmen und daraus eine normaleif-elseAnweisung machen.Grüssli
-
Mh gibts keine Möglichkeit daraus einen String zu machen? Ich hab mal dass heir ausprobiert, funzt aber irgendwie nicht so ganz: strcat(words[i],words[i+1])
MfG
Stromberg
-
Ich halte dieses Elend nicht mehr aus:
std::string temp; if(i < (words.size() - 1)) { // Sofern words ein std::string ist. temp.append(words, i, 2); } else { temp = ' '; }Ist auch gleich viel leserlicher.
Grüssli
-
Stromberg* schrieb:
Mh gibts keine Möglichkeit daraus einen String zu machen? Ich hab mal dass heir ausprobiert, funzt aber irgendwie nicht so ganz: strcat(words[i],words[i+1])
MfG
Strombergsollten word[i] und word[i+1] vom typ char sein gibt es einen konstruktor der string-klasse der daraus einen string macht
std::string(1,word[i]) + std::string(1,words[i+1])
-
Oder auch
words.substr(i,2)
-
So, endlich ist es perfekt:
if((temp = (i < (words.size()-1)) ? string(1,words[i])+string(1,words[i+1]) : " ") == "ff") { ++SPECIAL_letters[0]; } else if(temp == "fl") { ++SPECIAL_letters[1]; } else if(temp == "fi") { ++SPECIAL_letters[2]; }Ich Zähle in einem Text die aufeinanderfolgenden Buchstaben Paare "ff" "fi" und "fl" (C++ Primer Übung 6.9).
Findet ihr den Code mit "?"-Operator wirklich so umständlich?MfG
Stromberg
-
Stromberg* schrieb:
Findet ihr den Code mit "?"-Operator wirklich so umständlich?
Wieso schreibst du nicht einfach lesbaren Code?
Code Obfuscation ist nicht wirklich ein Zeichen guter Programmierung.

-
Stromberg* schrieb:
Findet ihr den Code mit "?"-Operator wirklich so umständlich?
Das nicht, aber in Kombination mit der Zuweisung im Ausdruck finde ich's schwierig lesbar. Folgendes würde mir wesentlich besser gefallen:
std::string temp = i<(words.size()-1)? words.substr(i,2) : " "; if( temp == "ff") ...
-
Stromberg schrieb:
Ich Zähle in einem Text die aufeinanderfolgenden Buchstaben Paare "ff" "fi" und "fl" (C++ Primer Übung 6.9).
Badestrand schrieb:
Stromberg* schrieb:
Findet ihr den Code mit "?"-Operator wirklich so umständlich?
Das nicht, aber in Kombination mit der Zuweisung im Ausdruck finde ich's schwierig lesbar. Folgendes würde mir wesentlich besser gefallen:
std::string temp = i<(words.size()-1)? words.substr(i,2) : " "; if( temp == "ff") ...Ich finds immernoch hässlich - und vermutlich ist es auch sinnlos...
if (words.empty ()) return; for (std::string::const_iterator i(words.begin()), e(words.end()-1); i != e; ++i) { if (*i != 'f') continue; switch (*(i+1)) { case 'f': ++SPECIAL_letters[0]; break; case 'l': ++SPECIAL_letters[1]; break; case 'i' ++SPECIAL_letters[2]; break; } }oder allgemeiner:
if ( words.size() < tosearch.size() ) return; for (std::string::const_iterator i(words.begin()), e(words.end()-tosearch.size()); i != e; ++i) { std::string tmp (i, e); if (tmp == tosearch) ++SPECIAL_letters[0]; }Geht bestimmt auch noch hübscher - aber kA...
bb