scanf_s("%s", name); // 錯誤:%s 格式需緩衝區大小
char name[40];
scanf_s("%s", name, (unsigned)sizeof(name)); // 或 40
// 或者
scanf_s("%39s", name); // 寬度限制,但仍建議傳大小
scanf_s 是 C11 標準庫(Microsoft 實現)的安全版本,**所有 %s、%c、%[ 格式必須緊跟緩衝區大小參數**(rsize_t 類型),防止緩衝區溢出。
| 函數 | %s 參數個數 | 安全性 | 適用場景 |
|---|---|---|---|
| scanf | 1 (地址) | 無保護 | 標準 C、跨平台 |
| scanf_s | 2 (地址, 大小) | 運行時檢查 | Windows/MSVC、安全要求高 |
fgets(name, sizeof(name), stdin) + 去換行,完全避開 scanf 系列問題。scanf_s 時,**務必傳遞緩衝區大小**,否則編譯報錯 C4473 / 運行崩潰。scanf_s("%s", name, sizeof(name)) 才是正確姿勢。記住:安全版掃描函數要求顯式緩衝區大小,這是為了防止緩衝區溢出漏洞。