以下代碼會導致錯誤並殺死我的應用程序。這很有意義,因爲緩衝區只有10個字節長,文本長度爲22個字節(緩衝區溢出)。帶緩衝區太小的sprintf_s
char buffer[10];
int length = sprintf_s(buffer, 10, "1234567890.1234567890.");
如何捕獲此錯誤,以便報告而不是崩潰我的應用程序?
編輯:
閱讀下面的評論我_snprintf_s去後。如果它返回-1值,那麼緩衝區沒有更新。
length = _snprintf_s(buffer, 10, 9, "123456789");
printf("1) Length=%d\n", length); // Length == 9
length = _snprintf_s(buffer, 10, 9, "1234567890.1234567890.");
printf("2) Length=%d\n", length); // Length == -1
length = _snprintf_s(buffer, 10, 10, "1234567890.1234567890.");
printf("3) Length=%d\n", length); // Crash, it needs room for the NULL char
傳遞的緩衝區大小和緩衝區大小減去一個是鈍的,而且容易出錯。您應該更喜歡下面描述的變體: length = _snprintf_s(buffer,_TRUNCATE,「1234567890.1234567890。」); 由於省略了第一個大小參數,因此編譯器使用模板過載來推斷大小。 _TRUNCATE是一個特殊的值,它可以完成它所說的事情。沒有幻數,現在你的代碼是安全的,可維護的,並且是一個很好的例子。 如果你喜歡這個評論和_snprintf_s,那麼你應該選擇我的答案,而不是危險的snprintf/_snprintf答案。 – 2014-12-17 22:40:06