while (scanf_s("%d%d%d", &n, &k, &m) == 3 && n) {
// 處理邏輯
}
scanf_s 返回成功匹配項數,==3 表示三個整數都讀取成功,&& n 表示 n 非零繼續。
// 核心:cin >> 返回流引用,流轉 bool 判斷是否有效
while (cin >> n >> k >> m && n) {
// 處理邏輯
}
cin >> n 提取整數,返回 cin 引用cin >> n >> k >> m 依次提取,任一失敗(EOF、類型不匹配)流進入 fail 狀態while (cin ...) 隱式調用 operator bool(),流有效為 true,失敗/EOF 為 false&& n 短路求值,n 為 0 時跳出循環| 特性 | scanf 系 | cin/cout |
|---|---|---|
| 類型安全 | 運行期格式串檢查 | 編譯期類型推導 |
| 擴展性 | 難擴展自定義類型 | 重載 operator>>/<< |
| 同步性能 | 快(無同步開銷) | 默認同步 stdio,可關閉 |
| 錯誤恢復 | 手動清緩衝區 | cin.clear(), cin.ignore() |
ios::sync_with_stdio(false); // 關閉 C/C++ 流同步
cin.tie(nullptr); // 解除 cin/cout 綁定
// 然後用 cin >> ... 速度媲美 scanf
#include
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k, m;
while (cin >> n >> k >> m && n) {
// 核心邏輯
}
return 0;
}
while (cin >> n >> k >> m && n) 是現代 C++ 競技編程、OJ 題目的標準輸入循環寫法。