howto:convert_from_to_string
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | howto:convert_from_to_string [2020-08-22 13:36] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Werte in / aus Zeichenkette umwandeln ====== | ||
+ | > // Es gibt Ideen, denen man nicht entrinnen kann. // | ||
+ | >> --- Theodor Herzl | ||
+ | |||
+ | In jeder streng typisierten Programmiersprache | ||
+ | steht man relativ bald vor einer der beiden Fragen: | ||
+ | |||
+ | * Wie kann man eine Zahl aus einer Zeichenkette lesen? | ||
+ | * Wie kann man eine Zahl in eine Zeichenkette umwandeln? | ||
+ | |||
+ | C++ 2011 definiert in [[..: | ||
+ | <code cpp> | ||
+ | std::string s = std:: | ||
+ | double d = std:: | ||
+ | int i = std:: | ||
+ | </ | ||
+ | (Unter MingGW 4.7.x sind diese mit einem [[http:// | ||
+ | |||
+ | Die Aufgabenstellung lässt sich auf beliebige Datentypen '' | ||
+ | Die allgemeine Lösung in C++ setzt Ein-/ | ||
+ | für den betreffenden Datentyp '' | ||
+ | Gibt es (bisher) keine, sollten diese definiert werden. | ||
+ | Alternativ können eigene Spezialisierungen der Schablonen festgelegt werden | ||
+ | (was vom Arbeitsaufwand auf das Gleiche hinaus läuft). | ||
+ | ===== Implementierung ===== | ||
+ | <code cpp convert.h> | ||
+ | //: convert.h : Umwandlung von / in string - R.Richter 2010-06-25 | ||
+ | ///////////////////////////////////////////////////////////////// | ||
+ | |||
+ | #ifndef CONVERT_H | ||
+ | #define CONVERT_H | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | namespace convert | ||
+ | { | ||
+ | template < | ||
+ | std::string str(T const& x) | ||
+ | { | ||
+ | std:: | ||
+ | os << x; | ||
+ | return os.str(); | ||
+ | } | ||
+ | |||
+ | class error : public std:: | ||
+ | { | ||
+ | public: | ||
+ | error(std:: | ||
+ | }; | ||
+ | | ||
+ | template < | ||
+ | T to(std:: | ||
+ | { | ||
+ | std:: | ||
+ | T x; | ||
+ | is >> x; | ||
+ | if (!is) | ||
+ | throw Error(" | ||
+ | return x; | ||
+ | } | ||
+ | } // namespace convert | ||
+ | |||
+ | #endif // CONVERT_H | ||
+ | </ | ||
+ | ===== Anwendung ===== | ||
+ | <code cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include " | ||
+ | |||
+ | void test() | ||
+ | { | ||
+ | int n = 42; | ||
+ | |||
+ | std::string s = convert:: | ||
+ | double answer = convert:: | ||
+ | |||
+ | if (n != answer) throw " | ||
+ | |||
+ | std::cout << answer << ' | ||
+ | | ||
+ | int questionable = convert:: | ||
+ | int wrong = convert:: | ||
+ | } | ||
+ | </ | ||
+ | Kann eine Zeichenkette nicht in den Zieldatentyp umgewandelt werden, | ||
+ | wird eine Ausnahme geworfen: | ||
+ | <code cpp> | ||
+ | int main() | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | test(); | ||
+ | } | ||
+ | catch(convert:: | ||
+ | { | ||
+ | std::cerr << e.what() << ' | ||
+ | } | ||
+ | catch(...) | ||
+ | { | ||
+ | std::cerr << " | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||