文件 ride.in 內容:
COMETQ HVNGAT
fscanf(input, "%s %s", comet, group);
輸出卻只有 HVNGAT。
文件以 **UTF-8 with BOM** 保存,開頭 3 字節 EF BB BF。
fscanf 讀取第一個 %s 時,跳過空白字符,**但 BOM 不屬於空白字符**,被作為第一個 token 讀入 comet (顯示為亂碼或空),導致第二個 %s 讀到 HVNGAT。
FILE *fp = fopen("ride.in", "rb"); // 二進制模式
unsigned char bom[3];
fread(bom, 1, 3, fp);
if (!(bom[0]==0xEF && bom[1]==0xBB && bom[2]==0xBF)) {
fseek(fp, 0, SEEK_SET); // 無 BOM,回退
}
// 後續用 fscanf(fp, ...) 或 fgets 解析
char line[256];
fgets(line, sizeof(line), fp); // 讀整行
// 手動去除可能的 BOM
if (strncmp(line, "\xEF\xBB\xBF", 3) == 0) memmove(line, line+3, strlen(line)-2);
sscanf(line, "%s %s", comet, group);
**約定項目文件統一使用 UTF-8 無 BOM**,避免跨平台、跨語言解析異常。