| 函數 | 緩衝模式 | 回車處理 | 可見性 |
getchar() | 行緩衝 | 需按 Enter 送出,= 留在緩衝區 | 不回顯 |
getche() (conio.h) | 無緩衝/字符級 | 立即返回,無需 Enter | 回顯 |
getch() (conio.h) | 無緩衝 | 立即返回 | 不回顯 |
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;
}
跨平台即時輸入建議
| 平台 | 方案 |
| Linux/Unix | termios 關閉 canonical mode (`stty -icanon`) |
| Windows | _getche() / _getch() (MSVC) 或 conio.h (MinGW) |
| 跨平台庫 | ncurses (pdcurse Windows 移植) / SDL2 / GLFW |
總結
getchar() 為行緩衡,無法即時檢測單一字符 = 作為結束條件。標準 C 應用 fgets() 讀行或迴圈中檢查 c == '=' 並忽略 \n。getche() 為非標準 Windows 專用即時輸入函數。跨平台專案建議使用 ncurses 或圖形庫處理即時鍵盤輸入。
- 上一篇文章: Ruby 国内镜像源配置:淘宝源失效后的替代方案与代理设置
- 下一篇文章: Maven 依賴管理:僅下載 Jar 包的 pom.xml 配置驗證與最佳實踐
Copyright ©
程式碼之家 All Rights Reserved