String filtern
-
@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