首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C語言程序輸入 1 應輸出 1、2 卻陷入死循環原因分析

     編輯:程式設計疑難解答

問題代碼

#include <stdio.h>
char S[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
int main() {
    char c; int i = 1;
    while ((c = getchar()) != EOF) {
        for (i; S[i] != c; i++)
            printf("%d\n", i);
    }
    return 0;
}

錯誤原因

  1. EOF 判斷:控制台輸入 `EOF` 在 Windows 下需按 Ctrl+Z 然後 Enter,直接關閉終端或輸入其他字符不會觸發 `EOF`。
  2. 變量 `i` 未重置:`for (i; ...` 使用外部變量 `i`,循環結束後 `i` 保留上次值,下次輸入不會從 1 開始查找。
  3. 邏輯缺陷:若輸入字符不在 `S` 中,`S[i] != c` 永遠為真,導致越界訪問並無限循環。

修正版本

#include <stdio.h>
#include <string.h>

char S[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";

int main() {
    char c;
    while ((c = getchar()) != EOF) {
        if (c == '\n') continue; // 跳過換行
        int found = 0;
        for (int i = 0; i < strlen(S); i++) {
            if (S[i] == c) {
                printf("%d\n", i);
                found = 1;
                break;
            }
        }
        if (!found) printf("字符 '%c' 不在鍵盤映射中\n", c);
    }
    return 0;
}

測試方法

運行程序,輸入 `1` 並按 Enter,應輸出 `1`(對應 `S[1]`),再輸入 `2` 輸出 `2`,最後按 Ctrl+Z Enter 結束。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved