2016-04-29 12 views
5

Ich erwartete, dass der folgende Code verschiedene Zeitstempel t1 und t2 drucken sollte, jedoch zeigt das Ergebnis, dass t1 und t2 gleich sind. Wo habe ich den Fehler gemacht?Wie man ctime() benutzt, um verschiedene Zeitstempel zu drucken

#include<iostream> 
#include<ctime> 

using namespace std; 

int main() 
{ 
    time_t t1 = time(NULL); 
    cout << "time now " << ctime(&t1) << endl; 
    time_t t2 = t1 + 10000.0; 
    cout << "time now " << ctime(&t1) << endl << " time later " << ctime(&t2) <<endl; 
} 

Ergebnis:

time now Thu Apr 28 20:37:03 2016 

time now Thu Apr 28 20:37:03 2016 

time later Thu Apr 28 20:37:03 2016 
+0

PS: Basierend auf den wunderbaren Antworten unten, sollte das Problem zu verwendet werden, um sowohl wie ctime() Funktion funktioniert und die Ordnung Compiler cout Argumente zu bewerten. Zu Letzterem siehe http://stackoverflow.com/questions/12960241/explain-the-order-of-evalution-in-printf für ein Beispiel – daydayup

Antwort

4

Die Antwort auf Ihre Frage in the manual page for the ctime() function gefunden werden kann:

Der Rückgabewert zeigt auf eine statisch zugewiesene Zeichenfolge, die durch nachfolgende Aufrufe überschrieben könnte werden zu einem der Datum und Uhrzeit Funktionen.

ctime() gibt einen Zeiger auf einen internen Puffer zurück, den es verwendet. Jedes Mal, es heißt, gibt es einen Zeiger auf den gleichen Puffer:

cout << "time now " << ctime(&t1) << endl << " time later " << ctime(&t2) <<endl; 

Für diese Zeile Code, Compiler generierten Code, ctime() zweimal aufruft, dann führt den << Operator. Aber beim zweiten Aufruf an ctime() überschrieb es den Puffer mit dem zweiten Mal, wenn der << Operator die Ausgabe formatiert, weil das Ergebnis des ersten Aufrufs ctime() derselbe Zeiger ist, und der Puffer, auf den er verweist, wurde überschrieben durch den zweiten Aufruf an ctime(), erhalten Sie die gleiche Zeit zweimal gedruckt.

Vielen Dank für das Posten eines Minimal, Complete, and Verifiable example.

3

Was ist ctime tatsächlich zurück? Von cppreference:

Zeiger auf eine statische nullterminierte Zeichenfolge, die die textliche Darstellung von Datum und Uhrzeit enthält. Die Zeichenfolge kann zwischen std::asctime und std::ctime gemeinsam genutzt werden und kann bei jedem Aufruf einer dieser Funktionen überschrieben werden.

Es funktioniert wahrscheinlich, dass auf Ihrem Compiler, der später ctime() zuerst aufgerufen wird, dann die neuere ctime(), dann beide operator<<() s ausgewertet bekommen - was das gleiche char* emittieren. Aufgrund der nicht angegebenen Reihenfolge hat Ihr Code ein nicht definiertes Verhalten. Bei einigen Compilern könnte es so funktionieren, wie du es dir erhofft hast! Bei dir passiert es nicht.

Wenn Sie die beiden Anrufe trennen:

cout << "time now " << ctime(&t1) << endl; 
cout << " time later " << ctime(&t2) <<endl; 

Sie würden auf jeden Fall und konsequent verschiedene Werte sehen.

2

Zitat aus N1570 7.27.3 Zeitkonvertierungsfunktionen:

Mit Ausnahme der Strftime Funktion Diese Funktionen geben jeweils einen Zeiger auf eine von zwei Arten von statischen Objekten: einer kaputten Zeitstruktur oder Array von Zeichen.Ausführung von Alle Funktionen, die einen Zeiger auf einen dieser Objekttypen zurückgeben, können die Informationen in jedem Objekt des gleichen Typs überschreiben, auf das der Wert von einem vorherigen Aufruf von verweist, und die Funktionen sind nicht erforderlich Datenrennen mit einander zu vermeiden.

Dies deutet darauf hin, dass die darauf Inhalt von dem, was von ctime() zurückgegeben wird, kann durch einen anderen Anruf von ctime() überschrieben werden, so dass Sie das Ergebnis zu kopieren, um das Ergebnis in einem Ausdruck ohne Sequenzpunkt, dass zu verwenden.

Try this:

#include<iostream> 
#include<ctime> 
#include<string> 

using namespace std; 

int main() 
{ 
    time_t t1 = time(NULL); 
    cout << "time now " << ctime(&t1) << endl; 
    time_t t2 = t1 + 10000.0; 
    string t1s = ctime(&t1); 
    string t2s = ctime(&t2); 
    cout << "time now " << t1s << endl << " time later " << t2s <<endl; 
}