2014-10-04 78 views
5

我使用Valgrind工具調試了我的代碼。它在此功能中顯示此錯誤。我在下面給出了錯誤和我的功能。我不知道這裏有什麼問題?我該如何糾正它? 我的錯誤是。未初始化的值是由堆棧分配創建的

未初始化值由堆棧分配在0x80996D7創建: cdtojd(的std :: string常量&)

我的代碼。

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

您是否考慮檢查sscanf()是否存在錯誤? – 2014-10-04 08:06:19

+2

檢查sscanf是否成功 – Igor 2014-10-04 08:06:59

回答

3

錯誤的含義基本上是指您在分配給它之前使用了一個變量。這可能適用的唯一變量是dd,mm,yy

這意味着您的sscanf調用不會寫入它們全部三個。如果您傳入未完全指定的日期,則會發生這種情況。

請注意,sscanf會返回一個值,告訴您寫入的變量有多少。你應該檢查返回值,如果它不返回3,應該放棄(或者填寫一些默認值),因爲不是所有的字段都會被填充。

+0

@SmithDwayne''%2d%2d%4d「'不會做你認爲它做的事。此外,ISO 8601是唯一允許的日期格式。 – o11c 2014-10-04 08:17:17

1

有沒有錯誤檢查sscanf,這意味着一些變量可能保持未初始化,並在以後使用,例如,

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; 

上面的代碼可能會發出作爲輸出:

32550 3249645428 32550 
Arguments read: 0 
32550 3249645428 32550 

,其中所有三個參數保持初始化。