2014-10-04 5 views
5

Ich debuggte meinen Code mit dem Tool Valgrind. Es zeigt diesen Fehler bei dieser Funktion an. Ich habe unten den Fehler und meine Funktion angegeben. Ich weiß nicht, was ist das Problem hier? Wie kann ich es korrigieren? Mein Fehler ist.Nicht initialisierter Wert wurde durch eine Stapelzuweisung erstellt

Uninitialised Wert durch einen Stapel Zuweisung an 0x80996D7 erstellt wurde: cdtojd (std :: string const &)

mein Code.

double cdtojd(const string &cdate); 

double cdtojd(const string &cdate) 
{ 
    int dd,mm,yy; 
    int y,m; 
    double jd=0; 

    //mm = atoi(cdate.substr(0,2).c_str()); 
    //dd = atoi(cdate.substr(2,2).c_str()); 
    //yy = atoi(cdate.substr(4,4).c_str()); 

    sscanf(cdate.c_str(),"%2d%2d%4d",&mm,&dd,&yy); 

    //cout<<mm<<"..."<<dd<<"...."<<yy<<endl; 

    y = (yy - 1900) * 372; 

    m = (mm-1) * 31; 

    jd = dd + m + y; 

    return jd; 
} 
+2

Haben Sie in Betracht gezogen, sscanf() auf Fehler zu überprüfen? –

+2

Überprüfen Sie, ob sscanf erfolgreich war – Igor

Antwort

3

Die Bedeutung des Fehlers besteht im Wesentlichen darin, dass Sie eine Variable verwenden, bevor Sie ihr zuweisen. Die einzigen möglichen Variablen sind dd, mm, yy.

Dies bedeutet, dass Ihr sscanf Anruf nicht an alle drei schreibt. Dies tritt auf, wenn Sie ein Datum übergeben, das nicht vollständig angegeben ist.

Beachten Sie, dass sscanf einen Wert zurückgibt, der Ihnen sagt, wie viele der Variablen geschrieben wurden. Sie sollten den Rückgabewert überprüfen und abbrechen (oder einige Standardwerte ausfüllen), wenn 3 nicht zurückgegeben wird, weil dann nicht alle Felder ausgefüllt wurden.

+0

@SmithDwayne '"% 2d% 2d% 4d "' wird nicht tun, was Sie denken, dass es tut. Außerdem ist ISO 8601 das einzige zulässige Datumsformat. – o11c

1

Es gibt keine Fehlerüberprüfung für sscanf und das bedeutet, dass einige Variablen möglicherweise nicht initialisiert und anschließend verwendet werden, z.

std::string str = "invalid"; 
unsigned int dd,mm,yy; 
cout << dd << " " << mm << " " << yy << endl; 
cout << "Arguments read: " << sscanf(str.c_str(),"%2d %2d %4d",&mm,&dd,&yy) << endl; 
cout << dd << " " << mm << " " << yy; 

der obige Code könnte als Ausgang emittieren:

32550 3249645428 32550 
Arguments read: 0 
32550 3249645428 32550 

, wo alle drei Argumente nicht initialisierten bleiben.