char c;
c = getchar();
while (c != '\n') {
if (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') i++;
else if (c == ' ') j++;
else if (c >= '0' && c <= '9') k++;
else s++;
// 缺少再次讀取 c = getchar();
}
printf(...);
c 只讀取一次,循環體內未更新 c,導致條件 c != '\n' 永真,進入**死循環**,程序卡住無法輸出結果。
int i = 0, j = 0, k = 0, s = 0;
char c;
printf("請輸入字符串:\n");
c = getchar();
while (c != '\n') {
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) i++;
else if (c == ' ') j++;
else if (c >= '0' && c <= '9') k++;
else s++;
c = getchar(); // 關鍵:循環末尾讀取下一字符
}
printf("字母:%d 空格:%d 數字:%d 其他:%d\n", i, j, k, s);
使用字符數組緩衝整行,再遍歷統計,避免逐字符輸入的緩衝區殘留問題:
char str[1024];
fgets(str, sizeof(str), stdin);
for (int p = 0; str[p] && str[p] != '\n'; p++) {
// 同樣統計邏輯
}
核心教訓:循環條件變量必須在循環內更新,否則陷入無限循環。