4

日付文字列を 3 つの個別の int 変数 (年、月、日) に変換するプログラムを作成しています。

int m,d,y;
sscanf("2011-03-08","%i %*[-] %i %*[-] %i",&y,&m,&d);
cout << y<<" "<<m<<" "<<" "<<d<<std::endl;
sscanf("2011-03-07","%i %*[-] %i %*[-] %i",&y,&m,&d);
cout << y<<" "<<m<<" "<<" "<<d;

2011-03-08 または 2011-03-09 を変換すると、日は 0 になりますが、2011-03-07,06 の場合、日は 7,6 です... 期待どおりです。誰かがそれを説明できますか、なぜ08または09で機能せず、それらだけで機能しないのですか?

前もって感謝します!

4

3 に答える 3

5

見るsscanf

i
オプションで符号付きの整数に一致します。次のポインターは int へのポインターでなければなりません。整数は、0x または 0X で始まる場合は 16 進法で、0 で始まる場合は 8 進法で、それ以外の場合は 10 進法で読み取られます。ベースに対応する文字のみが使用されます。

08で始まるため、8 進整数としてスキャンされます0。しかし08、有効な 8 進整数ではありません07%dの代わりに使用すると%i、期待どおりに機能します。

sscanf("2011-03-08","%d %*[-] %d %*[-] %d", &y, &m, &d);

またはさらに単純な

sscanf("2011-03-08","%d-%d-%d", &y, &m, &d);

結果で何をしたいかによっては、次のことも考慮することができます。strptime

strptime - 時間の文字列表現を時間 tm 構造体に変換する

struct tm t;
strptime("2011-03-08, "%Y-%m-%d", &t);
于 2013-02-24T12:48:02.147 に答える
2

問題は、 が8 進整数として%i扱われるため、代わり08に使用することで解決できる可能性があります、これは C++ であるため、代わりに( )を使用する必要があります。%dstd::istringstream#include <sstream>

int y,m,d;
char delimiter;

std::istringstream dateStream("2011-03-08");
dateStream >> y >> delimiter >> m >> delimiter >> d;

std::cout << y << " " << m << " " << d;
于 2013-02-24T12:50:17.837 に答える
1

フォーマット文字列が間違っています...単純に"%4d-%02d-%02d"

sscanf も動作することを確認しても問題ありませんif (3 != sscanf(...)) { /* failed */ }

于 2013-02-24T12:49:48.107 に答える