2014-10-04 2 views
5

Valgrind 도구를 사용하여 코드를 디버깅했습니다. 이 함수는이 오류를 보여줍니다. 나는 아래에 오류와 나의 기능을 주었다. 나는 여기서 어떤 문제가 있는지 모른다. 어떻게 수정합니까? 내 오류가 있습니다.초기화되지 않은 값이 스택 할당에 의해 생성되었습니다.

초기화되지 않은 값이 0x80996D7에서 스택 할당에 의해 만들어진 : cdtojd (표준 : : 문자열 const를 &를)

내 코드입니다.

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()에서 오류가 있는지 확인해 보셨습니까? –

+2

sscanf가 성공했는지 확인하십시오. – Igor

답변

3

오류의 의미는 기본적으로 할당하기 전에 변수를 사용한다는 것입니다. 이것이 적용될 수있는 유일한 변수는 dd, mm, yy입니다.

즉, sscanf 전화가 세 전화 모두에 쓰고 있지 않음을 의미합니다. 이것은 완전히 지정되지 않은 날짜를 전달한 경우에 발생합니다.

sscanf은 얼마나 많은 변수를 썼는지 알려주는 값을 반환합니다. 반환 값을 검사하고 3을 반환하지 않으면 중단 (또는 일부 기본값 채우기)해야합니다. 왜냐하면 모든 필드가 채워지지 않을 것이기 때문입니다.

+0

@SmithDwayne' "% 2d % 2d % 4d"'당신이 생각하는대로하지 않을 것입니다. 또한 ISO 8601이 유일하게 허용되는 날짜 형식입니다. – o11c

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 

세 가지 인수가 초기화되지 않은 남아있는 곳.