2014-10-04 61 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 

,其中所有三个参数保持初始化。