namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


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 [[..:kennen:include:string]] Konversionsfunktionen für ganze und Gleitkommazahlen.
 +<code cpp>
 +  std::string s = std::to_string(123.45);
 +  double d = std::stod(s); // 123.45
 +  int i    = std::stoi(s); // 123
 +</code>
 +(Unter MingGW 4.7.x sind diese mit einem [[http://tehsausage.com/mingw-to-string|inoffiziellen Patch]] nutzbar.)
 +
 +Die Aufgabenstellung lässt sich auf beliebige Datentypen ''T'' verallgemeinern (siehe auch [[http://www.boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast.html|boost::lexical_cast]]). 
 +Die allgemeine Lösung in C++ setzt Ein-/Ausgabeoperatoren ''%%>>%%'' und ''%%<<%%'' 
 +für den betreffenden Datentyp ''T'' voraus.
 +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 <string>
 +#include <sstream>
 +#include <stdexcept>
 +#include <typeinfo>
 +
 +namespace convert
 +{
 +  template <typename T>
 +  std::string str(T const& x)
 +  {
 +    std::ostringstream os;
 +    os << x;
 +    return os.str();
 +  }
 +
 +  class error : public std::runtime_error
 +  {
 +  public:
 +    error(std::string const& why) : std::runtime_error(why) {}
 +  };
 +  
 +  template <typename T>
 +  T to(std::string const& s)
 +  {
 +    std::istringstream is(s);
 +    T x;
 +    is >> x; 
 +    if (!is) 
 +      throw Error("Can't convert \'" + s + "\' to type " + typeid(T).name());
 +    return x;
 +  }
 +} // namespace convert
 +
 +#endif // CONVERT_H
 +</code>
 +===== Anwendung =====
 +<code cpp>
 +#include <iostream>
 +#include <string>
 +#include "convert.h"
 +
 +void test()
 +{
 +  int n = 42;
 +
 +  std::string s = convert::str(n);
 +  double answer = convert::to<double>(s);
 +
 +  if (n != answer) throw "conversion failed";
 +
 +  std::cout << answer << '\n';
 +  
 +  int questionable = convert::to<int>(" 12Month"); // converts 12
 +  int wrong = convert::to<int>("Hallo"); // throws convert::error
 +}
 +</code>
 +Kann eine Zeichenkette nicht in den Zieldatentyp umgewandelt werden,
 +wird eine Ausnahme geworfen: 
 +<code cpp>
 +int main()
 +{
 +  try
 +  {
 +    test();
 +  }
 +  catch(convert::error& e)
 +  {
 +    std::cerr << e.what() << '\n';
 +  }
 +  catch(...)
 +  {
 +    std::cerr << "Fehler\n";
 +  }
 +  return 0;
 +}
 +</code>
 +
  

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki