考試環境輸入機制
- **上機題通常提供測試數據文件** (如
in.txt),考生程序從 **標準輸入 (stdin)** 讀取。
- 考試系統通過 **輸入重定向** 運行:
your_program.exe < in.txt。
- **程式碼中只需用
scanf/getchar/fgets 讀取 stdin**,**無需** 也不應在代碼中 fopen("in.txt", "r")。
鍵盤輸入 vs 重定向輸入
| 模式 | 適用場景 | 程式碼差異 |
| 鍵盤交互輸入 | 調試階段、填空題手動測試 | 無差異,scanf 等待用戶敲鍵 |
| 文件重定向 | 正式評測、批量測試 | 無差異,scanf 從文件流讀取 |
| 管道輸入 | Linux 進程間通信 | 無差異,scanf 從管道讀取 |
填空題特殊要求
- **必須在給定框架內填寫關鍵行**,不可重寫
main、不可加 #include (除非指定)。
- **輸出格式嚴格對齊**:空格、換行、寬度、精度,**多一字符扣分**。
- **常用輸出模式**:
printf("%d", x) 末尾無空格;printf("%d ", x) 有空格;printf("%d\n", x) 換行。
實戰模擬腳本 (Windows PowerShell)
# 編譯
gcc -std=c11 -Wall -Wextra -o main.exe main.c
# 執行測試
Get-Content in.txt | .\main.exe
# 或
.\main.exe < in.txt
# 對比輸出
Get-Content out.txt
.\main.exe < in.txt | diff - out.txt
常見輸入處理陷阱
// 1. scanf 留下換行符,後續 getchar/fgets 讀到空行
scanf("%d", &n);
getchar(); // 吞掉換行符
fgets(buf, sizeof(buf), stdin);
// 2. 多組測試數據,EOF 結束
while (scanf("%d", &x) == 1) { ... }
// 3. 讀取整行含空格
fgets(line, sizeof(line), stdin);
line[strcspn(line, "\n")] = '\0'; // 去除換行