Niet-geïnitialiseerde waarde is gecreëerd door een stapeltoewijzing

Ik debug mijn code met behulp van de tool Valgrind. Het toont deze fout bij deze functie. Ik heb hieronder de fout en Mijn functie gegeven. Ik weet niet wat hier het probleem is? Hoe kan ik het corrigeren?
Mijn fout is.

Niet-geïnitialiseerde waarde is gecreëerd door een stapeltoewijzing op 0x80996D7:
cdtojd(std::string const&)

Mijn code is.

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;
}

Antwoord 1, autoriteit 100%

De betekenis van de fout is in wezen dat u een variabele gebruikt voordat u deze toewijst. De enige variabelen waarop dit mogelijk van toepassing kan zijn, zijn dd, mm, yy.

Dit betekent dat uw sscanf-oproep niet naar alle drie schrijft. Dit gebeurt als je een datum doorgeeft die niet volledig is gespecificeerd.

Merk op dat sscanfeen waarde retourneert om u te vertellen naar hoeveel variabelen het is geschreven. U moet de retourwaarde controleren en afbreken (of enkele standaardwaarden invullen) als deze geen 3 retourneert, omdat dan niet al uw velden zijn ingevuld.


Antwoord 2, autoriteit 17%

Er is geen foutcontrole voor sscanfen dat betekent dat sommige variabelen niet-geïnitialiseerd kunnen blijven en daarna gebruikt, bijv.

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;

de bovenstaande code kan als uitvoer uitzenden:

32550 3249645428 32550
Arguments read: 0
32550 3249645428 32550

waarbij alle drie de argumenten niet geïnitialiseerd blijven.

Other episodes