diese Frage mit einer Antwort eingebaut kommt, aber ich wollte trotzdem diese kleine Kriegsgeschichte teilen über die Chance, es jemand anderes helfen könnte ...Umwandlung gelingt mit _stscanf_s C-Library-Funktion, aber nicht tatsächlich
Gegeben eine Eingabe von "20160708", Siehst du, was mit den folgenden C-Anweisungen falsch ist? Diese werden von einigen Code exzerpiert, die überprüft, ob ein Software-Update verfügbar ist ...
struct tm ParseTime;
memset(&ParseTime, 0, sizeof(ParseTime));
// Extract date information
int ScanResult = _stscanf_s(UTCDate, _T("%4i%2i%2i"),
&ParseTime.tm_year, &ParseTime.tm_mon, &ParseTime.tm_mday);
if (ScanResult != 3)
DEBUG_MESSAGE(MB_OK | MB_ICONERROR, _T("Debug: Unexpected Error"),
_T("ConvertUTCDateTime - could not scan UTCDate = '%s', ScanResult = %d"),
UTCDate, ScanResult);
Wir haben nicht entweder, auf den ersten. Und der obige Code hat den Systemtest viele Male bestanden.
Aber am 8. Juli verursachte es eine Ausnahme in der späteren assert-Anweisung, ohne die DEBUG_MESSAGE auszugeben.
Debugging zeigte, dass, obwohl ScanResult mit dem erwarteten Wert von 3 geladen wurde, 3 Felder erfolgreich konvertiert, wurde das ParseTime.tm_mday Feld tatsächlich mit 0 geladen, eine ungültige Monatszahl!
Aber der 'i' Formatbezeichner gibt "Integer" an, richtig? Also, was ist das Problem?
* Aber die 'i' Formatspezifizierer zeigt "Integer", richtig? Also, was ist das Problem? * Wie Sie herausgefunden haben, erlaubt es verschiedene Zahlenbasen, zu einem 'int' eingegeben zu werden. Vergessen Sie niemals [Murphys Gesetz] (https://en.wikipedia.org/wiki/Murphy%27s_law), insbesondere da andere Benutzer ihre eigenen Ideen haben, welche Daten eingegeben oder eingegeben werden sollen. –