String filtern
-
Hallo Community,
Könnt Ihr mir weiter helfen ?
Ich möchte ein String der ein Datum enthält in drei einzelne integer wandeln.
string datum ="12.11.2020" //Soll umgewandelt werden in int dd, mm ,yyyy;
Sodass
dd=12
mm=11
yyyy=2020
EnthältVielen Dank schonmal
LG
Tobias
-
Ab C++11 mittels get_time (gilt auch für Datumswerte, s. Beispiel dort).
Bei dir also als Formatstring
"%d.%m.%Y"
.
-
@Th69 Danke für die antwort ein guter Tipp
Ich hab es einfach mal mit strtok () versucht ... bin neu bei c++ und hatte gehofft ,dass es mit der
Klasse string eine schnelle und einfache methode gibt.Das Ganze war für meine selbst erstellte Klasse, die datum Daten verwaltet.
Hier mein Konstruktor ausschnitt
datum (const char string[]) { char str[25]; strcpy(str,(char*)string); char trennzeichen [] = "."; char *ptr; int dd[2],i=0; ptr =strtok(str,trennzeichen); while (ptr!=NULL) { dd[i] = atoi (ptr); ptr =strtok(NULL ,trennzeichen); ++i; } i=0; tag=dd[0]; monat=dd[1]; jahr=dd[2]; }
-
@tobi466
Bitte nutze kein strcpy so nicht. Dies ist keine gute Idee mehr.Ich würde dir folgende Idee Vorschlagen:
#include <boost/algorithm/string/classification.hpp> #include <boost/algorithm/string/split.hpp> datum(const std::string & date){ std::vector <std::string> payloadSplited; boost::split(payloadSplited, date, boost::is_any_of(".")); if(paylodSplited.size() > 2){ int dd = std::atoi(payloadSplited[0]); int mm = std::atoi(payloadSplited[1]); int year = std::atoi(payloadSplited[2]); } .... }
-
@pmqtt in C hätte ich
sscanf
benutzt.
Eine Zeile.
-
@DirkB Da hast du recht! Allerdings habe ich schon lange nicht mehr in C sscanf benutzt, was passiert wenn man dort
date = "20.05" sscanf(date,"%d.%d.%d,&a,&b;&c)
tippt ?
-
@pmqtt sagte in String filtern:
was passiert wenn man dort
date = "20.05"
sscanf(date,"%d.%d.%d,&a,&b;&c)tippt ?
Edit:
Einen Fehler wegen des ; nach dem b und einen wegen des fehlenden ; nach der )mit Komma und Semikolon am Ende:
Dann gibtsscanf
den Wert 2 zurück, in a steht 20, in b 5 und c bleibt so wie es ist.Wenn a,b oder c nicht vom Typ
int
sind, sollte es noch eine Compilerwarnung geben.
-
@DirkB Dann ist die sscanf Lösung die deutlich bessere Lösung als die von mir oben beschriebene.
Auch für c++...datum(const std::string & date){ int dd = -1,mm = -1,year = -1; sscanf(date.c_str(),"%d.%d.%d",&dd,&mm,&year); // hier jetzt fehererkennung einbauen }
-
if (3 != sscanf(date.c_str(),"%d.%d.%d",&dd,&mm,&year)) {// hier jetzt fehererkennung einbauen }
-
Noch etwas zum Nachtrag.
Ich finde es toll das es noch geht, dass es hier noch möglich ist eine gute Lösung konstruktiv zu erzeugen und einem Foren User zu helfen. Das ist leider nicht mehr selbstverständlich!
-
Und ich hab einiges gelernt
Danke für die Lösungsvorschläge
-
Ich habe noch einen anderen Vorschlag.
Immer wenn es um Datum und C++ geht, schau dir die "date.h" von Howard Hinnant an:
https://github.com/HowardHinnant/date
https://github.com/HowardHinnant/date/wiki/Examples-and-Recipes#include "date.h" date::sys_days tp; std::istringstream datumStream {"12.11.2020"}; if (datumStream >> date::parse("%d.%m.%Y", tp)) { // code, im einfachsten Fall: std::cout << "Das Datum ist: " << date::year_month_day(tp) << '\n'; } else { // datum ungültig }
-
Ab C++20 gibt es diese Funktion auch im Standard: std::chrono::parse