編寫四邊形判斷程序,要求用戶輸入 4 條邊長(1-100 整數),任何非整數、超範圍、無法構成四邊形的輸入均報錯並重新輸入該輪次。
scanf("%d") 遇非數字不消費輸入,導致死循環。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 讀取一行並驗證是否為 1-100 整數
int readValidInt(const char *prompt) {
char buf[64];
while (1) {
printf("%s", prompt);
if (fgets(buf, sizeof(buf), stdin) == NULL) {
exit(1); // EOF
}
// 去除換行符
buf[strcspn(buf, "\n")] = '\0';
// 檢查是否全為數字
int valid = 1;
for (int i = 0; buf[i]; i++) {
if (!isdigit(buf[i])) { valid = 0; break; }
}
if (!valid) {
printf("錯誤:請輸入正整數!\n");
continue;
}
int val = atoi(buf);
if (val < 1 || val > 100) {
printf("錯誤:請輸入 1~100 之間的整數!\n");
continue;
}
return val;
}
}
int main() {
int T = readValidInt("請輸入測試次數: ");
for (int kase = 1; kase <= T; kase++) {
printf("第 %d 次輸入\n", kase);
// 讀取四邊
int edges[4];
const char *prompts[4] = {
"請輸入 A 的邊長: ",
"請輸入 A 的對邊長: ",
"請輸入 A 的左鄰邊長: ",
"請輸入 A 的右鄰邊長: "
};
for (int i = 0; i < 4; i++) {
edges[i] = readValidInt(prompts[i]);
}
// 四邊形判斷邏輯
int a=edges[0], b=edges[1], c=edges[2], d=edges[3];
if (a+b+c <= d || b+c+d <= a || c+d+a <= b || d+a+b <= c) {
printf("無效輸入: 不能形成四邊形\n");
} else if (a == c && b == d) {
if (a == b) printf("該四邊形是: 正方形\n");
else printf("該四邊形是: 長方形\n");
} else {
printf("不規則四邊形\n");
}
printf("******************************\n");
}
return 0;
}
| 技術點 | 作用 |
|---|---|
| fgets() 替代 scanf() | 讀取整行,避免緩衝區殘留導致死循環 |
| strcspn() 去換行 | 安全移除 fgets 讀入的 \n |
| isdigit() 逐字符檢查 | 確保純數字輸入,拒絕 "12a" 等 |
| atoi() 轉換 | 字符串轉整數,前已驗證純數字故安全 |
strtod 檢查 endptr 是否指向字符串末尾。getInput(type, validator, errorMsg) 框架。C 語言無內置輸入驗證,「讀行 → 字符串校驗 → 轉換」 是處理用戶輸入的標準健壯模式。避免直接使用 scanf 處理交互式輸入,可消除 90% 的輸入相關 Bug。