为什么这个字符数组在调用另一个函数时会改变值?

时间:2013-08-16 22:41:34

标签: c++ string

为什么我的comportstr在此代码中被更改为垃圾值?我不明白我的char数组如何改变值,如果没有改变它。这两个印刷语句之间没有其他内容。

int main(int argc, char* argv[])
{  
    char comportstr[10];
    sprintf(comportstr,"COM%d",COMPORT_NUM);
    if(DEBUGGING) fprintf(stderr,"str is: %s\n", comportstr); //prints str is: COM3
    sprintf(curtime , "%s" , currentDateTime());
    if(DEBUGGING) fprintf(stderr,"str is: %s\n", comportstr); //prints str is: ;32
}

这是currentDateTime的作用。它根本不会修改comportstr。

// Gets current date/time, format is YYYY-MM-DD.HH;mm;ss
const std::string currentDateTime() 
{
    time_t     now = time(0);
    struct tm  tstruct;
    char       buf[80];
    tstruct = *localtime(&now);
    // Visit http://www.cplusplus.com/reference/clibrary/ctime/strftime/
    // for more information about date/time format
    strftime(buf, sizeof(buf), "%Y-%m-%d.%H;%M;%S", &tstruct);

    return buf;
}

2 个答案:

答案 0 :(得分:1)

sprintf(curtime , "%s" , currentDateTime());

currentDateTime函数返回std::string,但%s仅用于C风格的字符串。你想要currentDateTime().c_str()。你的编译器应该给你一个警告。

答案 1 :(得分:1)

currentDateTime()函数中,您将返回std::string,并传递给sprintf()的vararg界面。这不起作用,因为您无法将标准布局类型传递给vararg接口。也就是说,对sprintf()的第二次调用会导致未定义的行为。

您可以使用

来避免此问题
sprintf(curtime , "%s" , currentDateTime().c_str());

......或者,实际上,

strcpy(curtime, currentDateTime().c_str());