2016-06-03 8 views
-1

Mein Freund wurde beauftragt, an einem bestehenden C++ - Projekt seiner Firma zu arbeiten. Im Quellcode sah er etwas wie folgt aus:Können wir sprintf in g ++ - Implementierung überladen?

char* tmp = "882.30"; 
char buff[32]; 
sprintf(buff, "%e", tmp); 
printf("TEST: %s\n", buff); 

Beim Kompilieren, wurde eine Warnung ausgegeben: warning: format '%e' expects type 'double', but argument 3 has type 'char*' aber der Ausgang war erstaunlich: 8.823000e+002. Er war neugierig. Wie könnte es sein?

Um zu verdeutlichen, dass er ein neues kleines Projekt erstellt und er das gleiche Code-Snippet und den gleichen Compiler verwendet, aber es zeigte ein sehr unterschiedliches Ergebnis: 2.647480e-314.

Die Umgebung: Centos 5.x, gcc 4.4.7.

Was könnte der Grund hier sein? Das bestehende Projekt hat eine Überladungsfunktion von sprintf oder Compilern?

Antwort

2

Das ist undefiniertes Verhalten.

C99 §7.19.6.1/9

Wenn ein Argument für die entsprechende Umwandlungsspezifikation nicht der richtige Typ ist, ist das Verhalten undefiniert.

Das bedeutet, dass Sie garantiert unportable Ergebnisse/Verhalten erhalten.

0

Sie müssen atof explizite convert von char * Zeiger auf double

#include <cstdio> 
#include <cstdlib> 

int main(void) 
{ 
    const char* tmp = "882.30"; 
    char buff[32]; 
    sprintf(buff, "%e", atof(tmp)); 
    printf("TEST: %s\n", buff); 
    return 0; 
} 

BTW, können Sie nicht eine vorhandene Funktion außer Kraft setzen, weil die Verletzung auf die Eine Definition Regel ist (ODR).

+0

Ich weiß. Du hast missverstanden, warum ich diese Frage gestellt habe. –

+0

Ja, ich habe meine Antwort aktualisiert. Welche Umgebung ist '8.823000e + 002'? Die Umgebung: Centos 5.x, gcc 4.4.7.? – where23

+0

Ja. Centos 5.x, gcc 4.4.7 –