lstrcpynA 函式 (winbase.h)
將來源字串中的指定字元數複製到緩衝區。
語法
LPSTR lstrcpynA(
[out] LPSTR lpString1,
[in] LPCSTR lpString2,
[in] int iMaxLength
);
參數
[out] lpString1
類型:LPTSTR
接收複製字元的目的地緩衝區。 緩衝區必須夠大,才能包含 iMaxLength所指定的 TCHAR 值數目,包括終止 Null 字元的空間。
[in] lpString2
類型:LPCTSTR
函式要從中複製字元的來源字串。
[in] iMaxLength
類型:int
要從 lpString2 所指向的字串 複製到 lpString1 lpString1所指向的緩衝區,包括終止的 null 字元,TCHAR 值的數目。
傳回值
類型:LPTSTR
如果函式成功,傳回值就是緩衝區的指標。 即使來源字串大於 iMaxLength 個字元,函式還是可以成功。
如果函式失敗,則傳回值會 NULL,且 lpString1 可能不會以 Null 終止。
言論
lpString1 所指向的緩衝區必須夠大,才能包含終止的 Null 字元,而 iMaxLength 所指定的字元串長度值 包含終止 Null 字元的空間。
如果來源和目的地緩衝區重疊,則 lstrcpyn 函式具有未定義的行為。
安全性警告
使用此函式不正確可能會危害應用程式的安全性。 此函式會使用結構化例外狀況處理 (SEH) 來攔截存取違規和其他錯誤。 當此函式攔截 SEH 錯誤時,它會傳回 NULL,而不會終止字串,而不通知呼叫者發生錯誤。 呼叫端無法放心地假設空間不足是錯誤狀況。如果 lpString1 所指向的緩衝區 不足以包含複製的字串,則可能會發生緩衝區滿溢。 複製整個字串時,請注意,sizeof 會傳回位元組數。
例如,如果 lpString1 指向宣告為 TCHAR szString[100]
的緩衝區 szString1,sizeof(szString1) 會以位元組為單位提供緩衝區的大小,而不是 WCHAR,這可能會導致函式 Unicode 版本的緩衝區溢位。
緩衝區溢位情況是應用程式中許多安全性問題的原因,如果發生存取違規,可能會對應用程式造成阻斷服務攻擊。 在最壞的情況下,緩衝區滿溢可能會讓攻擊者將可執行的程式代碼插入您的進程,特別是如果 lpString1 是堆棧型緩衝區。
使用 sizeof(szString1)/sizeof(szString1[0])
提供適當的緩衝區大小。
請考慮改用 StringCchCopy;使用 StringCchCopy(buffer, sizeof(buffer)/sizeof(buffer[0]), src);
,請注意 buffer
不得為指標,或是使用 StringCchCopy(buffer, ARRAYSIZE(buffer), src);
,請注意,當複製到指標時,呼叫端會負責傳入字元中指向記憶體的大小。
檢閱 安全性考慮:Windows 用戶介面,再繼續進行。
注意
winbase.h 標頭會將 lstrcpyn 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型的
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
支援的最低伺服器 | Windows 2000 Server [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | winbase.h (包括 Windows.h) |
連結庫 | Kernel32.lib |
DLL | Kernel32.dll |
另請參閱
概念
參考