scanf("%d", &y);
// 緩衝區殘留 '\n'
gets(s); // 直接讀到換行符,以為輸入空字串
scanf("%d", &y) 讀取整數後,緩衝區仍保留使用者按下的 Enter(\n)。緊接的 gets(s) 遇到 \n 即視為輸入結束,導致讀到空字串。
scanf("%d", &y);
getchar(); // 吞掉殘留的 '\n'
gets(s); // 正常等待使用者輸入字串
fgets(s, sizeof(s), stdin);
// 移除結尾換行符
s[strcspn(s, "\n")] = '\0';
gets 無緩衝區長度檢查,極易造成緩衝區溢位,C11 標準已移除。fgets 安全、可控制最大讀取長度、保留 \n 方便判斷是否讀完整行。int read_int() {
int v; char buf[64];
while (1) {
if (fgets(buf, sizeof(buf), stdin) && sscanf(buf, "%d", &v) == 1) return v;
fprintf(stderr, "請輸入有效整數:");
}
}
void read_line(char *buf, size_t sz) {
if (fgets(buf, sz, stdin)) {
buf[strcspn(buf, "\n")] = '\0';
} else {
buf[0] = '\0';
}
}
採用「整行讀取 → 解析」模式,徹底避免格式化輸入函式殘留字元的陷阱。