2017-08-09 58 views
-4

前言:我在過去的夏天一直在學C,直到最近纔開始學習C++,所以我現在還不太瞭解它。用ctime保存新的時間點會覆蓋舊的字符串嗎?

我一直在試圖編寫一個C/C++程序,它可以識別窗口中的鼠標右鍵和鼠標點擊,並保存哪個按鈕被點擊,以及什麼時候進入一個指向字符串的指針陣列char **clicks。我整理這就像一個序列:按鈕,時間,按鈕,時間...

只要檢測到鼠標點擊,它需要無論是「R」或「L」,並做到這一點:

void writeClick(char *button) { 
    static char **tracker = clicks; 
    *tracker = button; 
    tracker++; 
    time_t seconds = time(NULL); 
    *tracker = ctime(&seconds); 
    tracker++; 
} 

我的問題:您可能已經注意到的問題是,每個數組元素與時間將指向相同的字符串。結果是每次點擊鼠標時都會更新時間,但它只會記住上次保存的時間。我想我可以用strcpy解決問題,但是如果我想保存多個字符串,那麼我不需要每個字符串都有一個新變量嗎?或者每次都有新的內存位置?我應該怎麼做?

我嘗試使用strcpy像這樣:

strcpy(*tracker, ctime(&seconds)); 

但在第二次點擊我的程序崩潰,我不知道爲什麼。

可能有用的其他信息:

我打算將數據發送到VBA,因爲我希望把它變成一個Excel電子表格。

我還沒有寫出我的代碼部分,它會在數組滿滿時動態增加數組,但目前它足夠大(50個元素)以包含數據而不會崩潰,因此我知道這可能不是問題。

檢測鼠標點擊的代碼部分使用Windows函數,除此之外,我認爲我的代碼不受我使用的操作系統的影響。點擊檢測我沒有任何問題(因爲我已經解決了這些問題)。

一位朋友告訴我她只會使用C++字符串和向量來完成這項工作,但我還不知道。我會查找它們,但如果可能的話,我希望找到一個解決方案。

+0

如果你確實是學習C++,也懶得尋找解決_without如果possible_。只需使用可用的正確工具,標準庫,並忘記(char)指針。 – Tas

+0

@Tas除「ctime」是標準庫的一部分外,是可用的正確工具,並使用char指針。把它的返回值拷貝到std :: string沒什麼問題,但是理解爲什麼這是必要的,這將涉及到學習char指針(和靜態變量,這是實際的混淆點)。 – Ray

+0

對不起,我的觀點只是「不用擔心'不使用'std :: string'」,因爲它是正確的工具。最終,OP不需要理解靜態變量或char *或其他任何東西,因爲如果他們剛剛使用了'std :: string',他們就不會遇到這些問題。國際海事組織,只是'std :: string time = ctime(&秒);'不需要理解 – Tas

回答

2

From cppreference.com's page on ctime

返回值

指向靜態空終止字符串保留日期和時間的文本表示。該字符串可以在std :: asctime和std :: ctime之間共享,並且可以在每次調用任何這些函數時被覆蓋。

所以,是的,到ctimeasctime下一個電話可以預期覆蓋由先前調用中使用的緩衝區。

strcpy(*tracker, ctime(&seconds)); 

,因爲沒有存儲已分配給*tracker持有該字符串最有可能失敗。

你可以

*tracker = strdup(ctime(&seconds)); 

分配和複製,但是這給你留下跟蹤的問題,其中的tracker元素,你必須手動free。這會很快令人難以置信的討厭。如果你希望用C來做到這一點,你將不得不strdupfree的一切,添加一個簿記結構,告訴你是否動態分配存儲,因此必須free,或做一個廣泛的重新設計。

由於您已經標記了C++,請按照朋友的建議使用std::vectorstd::string

Documentation on strdup.

Documentation on std::vector.

Documentation on std::string.

+0

感謝您的回覆!但是我不想讓我在整個程序運行時拷貝的字符串?你說這會導致內存泄漏,但我想保留這些數據,直到程序決定停止,將信息發送到Excel並關閉。 除非你想象一個程序發送數據到逐個數據包而不是一次全部發送到Excel? –

+0

@JoshGlazer如果你的目標是保存數據直到程序終止,那麼你可以'strdup'直到你用完存儲並讓運行時在退出時處理清理。但是要記錄下你所做的事情,以便那些關注的人知道你所做的事情,以及在不同情況下使用代碼時爲什麼也不會感到驚訝。如果這是一份學校作業,該標記可能會提出您爲什麼偏離最佳做法的問題,因此解決選擇問題仍然符合您的最佳利益。 – user4581301