競程或專案開發時,頻繁手動輸入測試資料極其低效。將輸入重導向至檔案、字串緩衝區,或使用格式化字串函數,可大幅提升除錯效率。
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ifstream cin("in.txt"); // 取代標準 cin
if (!cin) {
cerr << "開啟檔案失敗!" << endl;
return 1;
}
int a, b;
cin >> a >> b; // 直接從檔案讀取
cout << "Sum: " << a + b << endl;
cin.close();
return 0;
}
#include <stdio.h>
int main() {
freopen("in.txt", "r", stdin); // stdin 重導向
int a, b;
scanf("%d %d", &a, &b);
printf("Sum: %d\n", a + b);
fclose(stdin);
return 0;
}
#include <strstream> // 舊標準,建議用 <sstream>
#include <iostream>
using namespace std;
int main() {
char input[] = "10 20\n30 40"; // 測試資料
istrstream cin(input); // 或 istringstream cin(input);
int a, b, c, d;
cin >> a >> b >> c >> d;
cout << a << ' ' << b << ' ' << c << ' ' << d << endl;
return 0;
}
#include <stdio.h>
int main() {
char buffer[] = "10 20 30";
int a, b, c;
sscanf(buffer, "%d %d %d", &a, &b, &c);
printf("%d %d %d\n", a, b, c);
return 0;
}
| 函數 | 用途 | 原型 |
|---|---|---|
sprintf | 格式化資料寫入字串緩衝區 | int sprintf(char *buf, const char *fmt, ...); |
snprintf | 安全版 (防緩衝區溢位) | int snprintf(char *buf, size_t n, const char *fmt, ...); |
sscanf | 從字串解析格式化資料 | int sscanf(const char *buf, const char *fmt, ...); |
// 範例:組合 SQL 查詢字串 / 解析日期 char sql[256]; sprintf(sql, "SELECT * FROM users WHERE id=%d AND name='%s'", 1001, "Alice"); char date[] = "2024-12-25"; int y, m, d; sscanf(date, "%d-%d-%d", &y, &m, &d); // y=2024, m=12, d=25
#define DEBUG_INPUT 1
int main() {
#if DEBUG_INPUT
ifstream cin("testcase.in");
#else
// 正常使用 std::cin
#endif
// ... 統一的讀取邏輯
}
freopen 或直接管線 ./a.out < in.txt (Linux/Mac) 最快。ifstream 讀取專案目錄下的檔案。stringstream / sscanf 將測試向量內嵌在程式碼中,無外部依賴。