Bruch in String
-
Hallo,
ich habe einen Bruch in der Form (als String) "x/y". x und y stehen für
beliebige Zahlen. Ich möchte jetzt eine Funktion schreiben, die überprüft, ob
der string str, in der oben gezeigten Form ist. Ich weiß, mit boost könnte man
das wahrscheinlich einfacher machen, aber ich würde gerne wissen, wie ich das
machen könnte.bool isGood(std::string str) { // bla }Vielen Danke im Voraus!
-
Ich weiß, mit boost könnte man
das wahrscheinlich einfacher machenWie kommst Du denn darauf?
-
Boost.Regex
-
Was sind die Kriterien ob es ein Bruch deiner Form ist?
- Slash muss enthalten sein.
- Vor und nach dem Slash müssen Nummern stehen, bzw. ev. möchtest Du auch Variabeln zulassen.
- Whitespaces (wie Space) sollen erlaubt sein (z.B. "x/y" is gleich "x / y")Benutze std::string.find(..) etc.
Gruss Simon
-
Es soll einfach zuerst eine Zahl kommen, dann GLEICH ein Slash und dann wieder
eine Zahl.
-
sscanf ist da praktisch für.

std::string bruch("10/3"); int a,b; return sscanf(bruch.c_str(), "%i/%i" &a, &b) == 2;
-
Kannst du mir die Funktion erklären? (Ich kenne die ganzen C-Funktionen nicht!)
Muss ich dafür wieder irgendeine Header einbinden? cstdlib oder cstdio???
-
Ich wuerde in etwa folgendes machen:
bool TestRational(std::string const& s) { std::stringstream sstr(s); int i; if (! sstr >> i) return false; char c; sstr >> c; if (! c=='/') return false; if (! sstr>>i) return false; if (! sstr.str() == "") return false; return true; }
-
Brauchst #include <cstdio> und liegt dann auch im Namespace std.
sscanf tut folgendes:
1. Parameter wodrin gesucht werden soll
2. Parameter Format des gesuchten. %i steht dabei für einen Integer.
3. und 4. Parameter sind die Adressen in die eben jene gefundenen gespeichert werden.Der return-Wert ist die Anzahl der passenden Parameter. Also hier im Erfolgsfall 2.
Da sscanf aber nicht typensicher ist, ist es eigentlich ungern gesehen. Aber für diesen Fall eigentlich schön simpel und nicht so "gefährlich" wie printf.

http://www.cppreference.com/stdio/scanf.html
http://www.cppreference.com/stdio/sscanf.html
-
Danke für die Antworten!
-
[Sarkasmus]Last uns alle ein wenig unsichere Funktionen nutzen[/Sarkasmus]
bool is_fraction(std::string const& string) { std::ostringstream ss(string); int numbers; return (ss >> left) && (ss.get() == '/') && (ss >> numbers); }das sollte da schon reichen

-
@(D)Evil, pumuckl
nur zur Info - man kann den Streaming-operator '>>' auch verketten. Dafür ist er da. Also entweder so:
bool TestRational(std::string const& s) { std::stringstream sstr(s); int i; char c; return sstr >> i >> c >> i >> std::ws && c == '/' && sstr.eof(); }oder so
bool is_fraction(std::string const& string) { std::istringstream ss(string); // (i) wie Input int numbers; return (ss >> numbers).get() == '/' && (ss >> numbers); }.. ohne zu prüfen, ob dahinter noch was kommt. Wobei hier noch zu erwähnen ist, dass get() unformatiert einliest. Im Klartext heißt das hier, dass is_fraction bei "3/ 4" true liefert und bei "3 /4" false.
Tritt während des Lesens ein Fehler auf, so bleibt der stream im Fehlerzustand, solange man kein clear() aufruft; es ist also gar nicht notwendig ständig auf !fail zu prüfen.
Gruß
Werner
-
Hmm das war mir bewusst, und in dem Fall hab ich nicht daran gedacht, das error-flags gesetzt werden und damit das restliche einlesen eh nicht klappt. sorry.