2013-08-16 72 views
0

爲什麼我的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

什麼是CURTIME? –

+0

char curtime [16];對不起,我離開了! – user2619824

回答

1

在您的currentDateTime()函數中,您將返回std::string,該函數將傳遞給sprintf()的可變參數界面。這不起作用,因爲您無法將標準佈局類型傳遞給可變參數界面。也就是說,第二次調用sprintf()會導致未定義的行爲。

您可以通過使用

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

...或者,其實避免這個問題,

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

謝謝,雖然這不是我的主要問題。出於某種原因,我仍然遇到了在comportstr中獲取垃圾值的問題。我用strcpy替換了sprintf,但沒有任何變化。 – user2619824

+0

'curtime'數組的大小是多少? –

+0

我宣佈它是char curtime [16]; – user2619824

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

currentDateTime函數返回一個std::string,但%s僅用於C風格的字符串。你想要currentDateTime().c_str()。你的編譯器應該給你一個警告。

相關問題