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ält

    Vielen 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 gibt sscanf 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


Log in to reply