2016-06-16 15 views
0

私はthis answerに取り組んでいました。そして、私は難問にぶつかった:scanf has an assignment suppressing '*'繰り返し割り当てがget_timeに定義されていますか?

このオプションを指定すると、関数は任意の受信引数

への変換の結果を代入しません。しかしget_timeで使用された場合'*'は、A与えますVisual Studio、libC++、libstdC++:str >> get_time(&tmbuf, "%T.%*Y")の実行時エラーですので、サポートされていないと思います。

str >> get_time(&tmbuf, "%H:%M:%S.%Y UTC %b %d %Y"); 

This works'*'は受け付けていないので、これまでget_timeが行くように私の唯一の選択肢であるように思わ:私は二回tmbuf.tm_yearに読み込むことによって、入力を無視することを選択しました。このよう

。しかし、私たち皆が知っているように、それが機能しているという理由だけで、それが定義されているわけではありませ誰かがそれを確認することができます:

  1. get_time
  2. で二度のストリームを同じ変数を割り当てるために定義され、常に左から右へ%Yの1 発生率を踏みつけされますので、ない読み込まれます2 ND
+1

'get_time'は' scanf'とは関係ありません。どのような 'scanf'ルールが' get_time'に当てはまると思いますか?繰返し割り当ての妥当性については、規格は無効であるとは言いませんし、フォーマット要素が左から右に1つずつ処理されることも規定しています。実際には、書式文字列を処理する正確なアルゴリズムを指定します。このアルゴリズムは、このようなケースをエラーなしで処理します。 –

+0

@ n.m。私はあなたの質問に対する答えとして愚かな考え方をするつもりです。あたかもこれは安全だと思われますか?おそらくあなたは答えにそれを入力するよう促されますか? –

答えて

1

標準はget_timetime_get 22.4.5.1.1 におけるメンバーのフォーマット文字列を処理する正確なアルゴリズムを指定str>>get_time(...)を実行すると、最終的にはtime_get::getが呼び出されます。私は重要な部分を引用します:

この機能は、err = ios_base::goodbitを評価することから始まります。その後、反復のたびにsからゼロ個以上の文字を読み取ってループに入ります。以下で特に指定しない限り、ループは次の条件の最初のものが成立すると終了します。

(8.1) - 式fmt == fmtendが真と評価されます。

スキップ退屈なエラー処理部

(8.4)からfmtの次の要素は一緒に変換を形成し、必要に応じて変換指定文字、フォーマット続いて、修飾文字が続く、’%’に等しいです。 ISO/IEC 9945機能strptimeに有効な仕様です。 ボーリングエラー処理部分をスキップ関数がs = do_get(s, end, f, err, t, format, modifier)を評価します。ボーリングエラー処理部分をスキップします。この関数は、変換指定の最後をちょうど指すようにfmtをインクリメントしてループを続けます。

説明からわかるように、フォーマット文字列は厳密に左から右に厳密に処理されます。繰り返し変換仕様を特別に扱う規定はありません。だから、答えはイエスでなければなりません。あなたがしたことは、それが明確で完全に合法であることです。

関連する問題