2016-05-06 1 views
0

私は、日付を印刷する機能を持つヘッダファイルを開発しています。 次は、上記のことを行います。'@'はctimeベースの関数で出力されます

だから、
char Date(string date_format){ 
    if(date_format == "gg\dd\yyyy"){ 
       time_t t = time(0); 
    struct tm * now = localtime(& t); 
    cout << (now->tm_mday) << '/' 
    << (now->tm_mon + 01) << '/' 
    << (now->tm_year + 1900); 
    } 
    if(date_format == "mm\dd\yyyy"){ 
       time_t t = time(0); 
    struct tm * now = localtime(& t); 
    cout << (now->tm_mon + 01) << '/' 
    << (now->tm_mday) << '/' 
    << (now->tm_year + 1900); 
    } 

、.cppファイルにこの機能を使用するためにあなたはそれが「2016年6月5日」 を出力します

cout << Date("dd\mm\yyyy") << endl; 

を記述する必要がありますそして、それは、日付の最後にチルダを印刷する英語のもの(mm \ dd \ yyyy)を設定すると、イタリアの日付形式を出力します。 5/6/2016 @ 多分、コンパイラは '\ n'のようなエスケープシーケンスを使用しようとしていると思うが、 '\ m'または '\ d'を持つエスケープシーケンスは存在しないと考えているバックスラッシュのためですだから私はそれが賢明ではないと思った。 ありがとうございます。

+0

「dd \ mm \ yyyy」のような文字列は間違いなく多くの問題を引き起こすでしょう。はい、コンパイラはエスケープシーケンスを解釈しようとします'\ m'と' \ y'を使います。 –

+0

CおよびC++の文字列リテラル '" mm \\ dd \\ yy "'ではバックラッシュをエスケープする必要があります。しかし、これは '@ '文字については説明しません。問題は、あなたが表示していないコードのどこかにあります。 – Kaz

+0

C 'strftime'関数をお勧めします。 –

答えて

1

コードには大きな問題があります。

1)あなたは

(あなたは "GG \ DD \ YYYY" と "MM \ ddとの\のYYYY" を確認してください)フォーマット "DD \ミリメートルの\ YYYY" を渡すが、この形式はDate()にチェックされていません2)あなたの関数はcharを返す目的球として宣言されているが、returnはそれ

3にはありません)カズにより示唆されるように、あなたはすべての'\'はそれを倍にエスケープする必要があり(そのため「GG \\ DD \\ YYYY」、 "mm \\ dd \\ yyyy"など)

4)私はあなたが作成し、std::stringを返す関数を書くべきだと思って、outp utストリーム。あなたの実際の関数はstd::coutに書かれていますが、返り値は返されません(ポイント2を参照)。どのような戻り値の意味ですか? std::cout()Data()書き込みは、あなたがこのよう

Data("dd\\mm\\yyyy"); 
std::cout << std::endl; 

リターンstd::stringData()た場合に、それを使用する必要がありますので、あなたが

std::cout << Data("dd\\mm\\yyyy") << std::endl; 

を書くことができるなら、私はData()はそうあなたがそれを使用することができstd::stringを返すべきであることを示唆しています他のストリームと; std::cerr、例によって

std::cerr << Data("dd\\mm\\yyyy") << std::endl; 

5)time()/localtime()一部を複製する必要がありません。それは私がstd::ostringstream

std::string Date (std::string const & format) 
{ 
    std::string str; 

    time_t t = time(0); 
    tm * now = localtime(& t); 

    if ("gg\\dd\\yyyy" == format) 
     str = std::to_string(now->tm_mday) + "/" 
     + std::to_string(now->tm_mon + 01) + "/" 
     + std::to_string(now->tm_year + 1900); 
    else if ("mm\\dd\\yyyy" == format) 
     str = std::to_string(now->tm_mon + 01) + "/" 
     + std::to_string(now->tm_mday) + "/" 
     + std::to_string(now->tm_year + 1900); 
    // else if .... (other formats?) 
    else 
     str = "unrecognized format"; 

    return str; 
} 
を避けて、以下のバージョン

std::string Date (std::string const & format) 
{ 
    std::ostringstream oss; 

    time_t t = time(0); 
    tm * now = localtime(& t); 

    if ("gg\\dd\\yyyy" == format) 
     oss << (now->tm_mday) << '/' 
     << (now->tm_mon + 01) << '/' 
     << (now->tm_year + 1900); 
    else if ("mm\\dd\\yyyy" == format) 
     oss << (now->tm_mon + 01) << '/' 
     << (now->tm_mday) << '/' 
     << (now->tm_year + 1900); 
    // else if .... (other formats?) 
    else 
     oss << "unrecognized format"; 

    return oss.str(); 
} 

か、あなたがC++ 11やC++ 14を使用している場合、あなたはstd::to_string()を使用することができますを提案両方のケースで

等しいです

ps:申し訳ありません私の悪い英語

+0

あなたのポイント#2は間違いなく余分な末尾の文字が来る場所です - 不確定な戻り値が出力に送信されます。 –

+0

@Ben Voigt:yes:ランダムな文字。 – max66

関連する問題