コードには大きな問題があります。
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::string
Data()
た場合に、それを使用する必要がありますので、あなたが
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:申し訳ありません私の悪い英語
「dd \ mm \ yyyy」のような文字列は間違いなく多くの問題を引き起こすでしょう。はい、コンパイラはエスケープシーケンスを解釈しようとします'\ m'と' \ y'を使います。 –
CおよびC++の文字列リテラル '" mm \\ dd \\ yy "'ではバックラッシュをエスケープする必要があります。しかし、これは '@ '文字については説明しません。問題は、あなたが表示していないコードのどこかにあります。 – Kaz
C 'strftime'関数をお勧めします。 –