2016-06-16 6 views
0

Ich arbeitete an this answer. Und ich lief in ein Rätsel: scanf has an assignment suppressing '*':Ist die wiederholte Zuweisung für get_time definiert?

Wenn diese Option vorhanden ist, wird die Funktion nicht das Ergebnis der Umwandlung in jedem Empfangs Argument zuweisen

Aber wenn in get_time verwendete '*' gibt ein Laufzeitfehler auf Visual Studio, libC++ und libstdC++: str >> get_time(&tmbuf, "%T.%*Y"), also glaube ich, dass es nicht unterstützt wird.

Als solche habe ich Eingang in tmbuf.tm_year durch das Lesen zweimal zu ignorieren:

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

This works und scheint bisher meine einzige Möglichkeit zu sein, wie get_time geht, da die '*' nicht akzeptiert wird. Aber wie wir alle wissen, bedeutet es nicht, dass es definiert ist, nur weil es funktioniert. Kann jemand das bestätigen:

  1. Es definiert die gleiche Variable zweimal in get_time
  2. Der Strom immer lesen von links nach rechts wird zuweisen, so wird die 1 st Inzidenz von %Y gestampft werden, nicht der 2 nd
+1

'get_time' hat nichts mit' scanf' zu tun.Was lässt Sie denken, dass eine der 'scanf'-Regeln für 'get_time' gilt? Was die Gültigkeit der wiederholten Zuweisung anbelangt, sagt der Standard nicht, dass sie ungültig ist, und spezifiziert auch, dass Formatelemente nacheinander von links nach rechts verarbeitet werden. Tatsächlich spezifiziert es den genauen Algorithmus der Verarbeitung der Formatzeichenfolge. Der Algorithmus behandelt solche Fälle ohne Fehler. –

+0

@ n.m. Ich werde mit wehmütigen Gedanken als Antwort auf Ihre Frage gehen. Aber klingt, als ob das sicher ist? Vielleicht würden Sie sich inspirieren lassen, das in eine Antwort einzutippen? –

Antwort

1

der Standard spezifiziert den genauen Algorithmus, um die Format-Zeichenkette von get_time in 22.4.5.1.1 time_get Mitgliedern der Verarbeitung. (time_get::get ist, was schließlich aufgerufen wird, wenn Sie str>>get_time(...) tun). Ich zitiere die wichtigen Teile:

Die Funktion beginnt mit der Auswertung err = ios_base::goodbit. Es tritt dann in eine Schleife ein und liest null oder mehr Zeichen von s bei jeder Iteration. Sofern nachstehend nicht anders angegeben, endet die Schleife, wenn die erste der folgenden Bedingungen zutrifft:

(8.1) - Der Ausdruck fmt == fmtend wird als wahr ausgewertet.

überspringen langweilige Fehlerbehandlungsteile

(8,4) - Das nächste Element von fmt gleich ’%’, gegebenenfalls durch ein Modifikator Zeichen, gefolgt von einem Konvertierungsspezifizierer Zeichen folgt, das Format, die zusammen eine Umwandlung bildet Spezifikation gültig für die ISO/IEC 9945-Funktion strptime. überspringen langweilig Fehlerbehandlung Teile die Funktion wertet s = do_get(s, end, f, err, t, format, modifier)überspringen mehr langweilige Fehlerbehandlung Teile die Funktion inkrementiert fmt bis kurz nach dem Ende der Konvertierung Spezifikation und weiterhin Schleifen.

Wie aus der Beschreibung ersichtlich, wird die Formatzeichenfolge sequentiell von links nach rechts abgearbeitet. Es gibt keine Vorkehrung, um sich wiederholende Konvertierungsspezifikationen speziell zu behandeln. Die Antwort muss also "Ja" lauten. Was Sie getan haben, ist gut definiert und absolut legal.

Verwandte Themen