Datumseingabe - wie trennen?



  • hi,

    ich möchte ein programm schreiben, was mir verrät ob ein eingegebenes datum korrekt ist. das datum soll auf einmal eingegeben werden, allerdings möchte ich die variablen "tag", "monat" und "jahr" dann getrennt weiter verarbeiten.
    meine erste idee war diese, aber das funzt nicht. wie macht man das anders?

    cout << "Bitte ein Datum eingeben! (dd.mm.yyyy)" << endl;
      cin  >> tag >> monat >> jahr;
    

    tom



  • Probiers mal so:

    ...
    int tag, monat, jahr;
    ...
    
    cout << "Bitte ein Datum eingeben! (dd.mm.yyyy)" << endl;
    cin  >> datum;
    
    sscanf(datum,"%d.%d.%d",&tag,&monat,&jahr);
    


  • bevor ich das probieren kann, muss ich noch den datentyp von "datum" festlegen, nur was nehm ich da mit den punkten drin?
    bei datentyp "string" für "datum" sagt er

    /home/thomasle/kdevelop/ue_18/src/ue_18.cpp:21: error: cannot convert ` std::string' to `const char*' for argument `1' to `int sscanf(const char*, const char*, ...)'
    

    aber wenn ich datum als const string initialisiere, lässt es sich bei der eingabe dann doch nicht mehr ändern, oder? ausserdem kommt bei "const char datum=01.01.0001" dieser fehler:

    /home/thomasle/kdevelop/ue_18/src/ue_18.cpp:19: error: ambiguous overload for 'operator>>' in 'std::cin >> datum'
    /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/include/g++-v3/bits/istream.tcc:86: error: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>&(*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] <near match>
    /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/include/g++-v3/bits/istream.tcc:92: error: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_ios<_CharT, _Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] <near match>
    /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/include/g++-v3/bits/istream.tcc:101: error: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base&(*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>] <near match>
    /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/include/g++-v3/bits/istream.tcc:429: error: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>] <near match>
    /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/include/g++-v3/istream:685: error: std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*) [with _Traits = std::char_traits<char>] <near match>
    /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/include/g++-v3/istream:690: error: std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char*) [with _Traits = std::char_traits<char>] <near match>
    /home/thomasle/kdevelop/ue_18/src/ue_18.cpp:21: error: invalid conversion from `char' to `const char*'
    

    tom



  • int tag, monat, jahr;
    string datum;
    
    cout << "Bitte ein Datum eingeben! (dd.mm.yyyy)" << endl; 
    cin  >> datum; 
    
    sscanf(datum.c_str(),"%d.%d.%d",&tag,&monat,&jahr);
    

    cu



  • Die ursprüngliche Version funktioniert schon, die Trennung erfolgt durch Whitespaces!

    Das heißt bei:

    int day, month, year;
    cin >> day >> month >> year;
    

    funktioniert diese Eingabe wie erwartet:

    25 12 2005
    

    Aber, dass die Eingabe auch immer so schön kommt ist natürlich eher selten der Fall *g*

    MfG SideWinder



  • @cplusplus
    danke, funzt wie gedacht! *freu* allerdings muss ich noch schauen wie die ganze theorie dahinter ist, bzw warum das überhaupt funzt.

    @sidewinder
    so hätte ich das auch machen können, wollte aber das datum wirklich mit den punkten dazwischen eingeben
    btw: bist du der sidewinder, der auch im rover-forum ist?

    @all
    eigentlich sollte es doch auch noch ne spezielle lösung geben, mit

    #include <ctime> oder
    #include <time.h>
    

    hättet ihr da der vollständigkeit wegen auch ein beispiel für?

    danke, tom



  • Nein im Rover-Forum war ich noch nie.

    MfG SideWinder


Anmelden zum Antworten