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

C 語言 getchar() 結束條件:為何 = 無法作為結束字符與 getche() 替代方案

     編輯:程式設計綜合問答

問題現象

期望輸入 = 結束 `getchar()` 迴圈,但程式無法正常退出:


while ((str[i] = getchar()) != '=') i++;
// 輸入 = 後迴圈不結束

根因分析

getchar() 是標準 C 庫函數,行緩衝:使用者輸入字符存入標準輸入緩衝區,直到按下 Enter 才送達程式。輸入 = 後若不按 Enter,程式收不到;按了 Enter,緩衝區含 =\n,迴圈讀到 = 結束,但 \n 殘留影響後續輸入。

標準 C 解決方案(無 conio.h)

方案一:讀整行再解析


char line[1024];
if (fgets(line, sizeof(line), stdin)) {
    for (int i = 0; line[i] && line[i] != '='; i++) {
        str[i] = line[i];
    }
    // 處理 str...
}

方案二:逐字符讀取並手動檢查


int c, i = 0;
while ((c = getchar()) != EOF) {
    if (c == '=') break;  // 遇到 = 結束
    if (c != '\n') str[i++] = c;  // 忽略換行
}
str[i] = '\0';

conio.h 非標準方案(Windows 專用)


#include <stdio.h>
#include <conio.h>  // 非標準,僅 Windows (Turbo C, MSVC, MinGW)

int main() {
    char str[100];
    int i = 0, c;
    printf("輸入字符,= 結束:\n");
    while ((c = getche()) != '=') {  // 即時讀取,回顯
        str[i++] = c;
    }
    str[i] = '\0';
    printf("\n反轉輸出:");
    for (int n = i - 1; n >= 0; n--) putchar(str[n]);
    return 0;
}

跨平台即時輸入建議

函數緩衝模式回車處理可見性
getchar()行緩衝需按 Enter 送出,= 留在緩衝區不回顯
getche() (conio.h)無緩衝/字符級立即返回,無需 Enter回顯
getch() (conio.h)無緩衝立即返回不回顯
平台方案
Linux/Unixtermios 關閉 canonical mode (`stty -icanon`)
Windows_getche() / _getch() (MSVC) 或 conio.h (MinGW)
跨平台庫ncurses (pdcurse Windows 移植) / SDL2 / GLFW

總結

getchar() 為行緩衡,無法即時檢測單一字符 = 作為結束條件。標準 C 應用 fgets() 讀行或迴圈中檢查 c == '=' 並忽略 \n。getche() 為非標準 Windows 專用即時輸入函數。跨平台專案建議使用 ncurses 或圖形庫處理即時鍵盤輸入。

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