Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Sự khác biệt giữa getc(), getchar(), getch() và getche() trong C

Tất cả đều là hàm nhập ký tự từ input stream trong ngôn ngữ C/C++ (không phải Java). Mỗi hàm có hành vi khác nhau về buffering, echo, và luồng nhập.

1. getc()

  • Header: <stdio.h>
  • Đọc từ: Bất kỳ FILE* stream nào (stdin, file, pipe...).
  • Buffering: Có buffer (buffered).
  • Echo: Không hiển thị ký tự nhập ra màn hình.
  • Trả về: int (ký tự đọc được) hoặc EOF khi lỗi/hết file.
int getc(FILE *stream);

2. getchar()

  • Header: <stdio.h>
  • Đọc từ: Chỉ stdin (standard input).
  • Buffering: Có buffer (thường line-buffered).
  • Echo: Không hiển thị.
  • Trả về: int ký tự hoặc EOF.
  • Tương đương: getc(stdin).
int getchar(void);

3. getch()

  • Header: <conio.h> (Non-standard, chỉ Windows/DOS - Turbo C, Visual Studio cũ).
  • Đọc từ: Console (stdin) nhưng không qua buffer (unbuffered).
  • Echo: KHÔNG hiển thị ký tự vừa nhập.
  • Trả về: int ký tự ngay lập tức, không chờ Enter.
  • Dùng cho: Menu điều khiển, game, nhập mật khẩu (che ký tự).
int getch(void);

4. getche()

  • Header: <conio.h> (Non-standard, Windows/DOS).
  • Đọc từ: Console, unbuffered.
  • Echo: CÓ hiển thị ký tự vừa nhập ra màn hình.
  • Trả về: int ký tự ngay lập tức.
  • Khác biệt với getch(): Chỉ khác ở việc echo ký tự.
int getche(void);

Bảng so sánh tóm tắt

HàmHeaderStreamBufferEchoChờ Enter?Portable?
getc()stdio.hFILE* bất kỳCóKhôngCó (line-buffered)✅ ANSI C
getchar()stdio.hstdinCóKhôngCó✅ ANSI C
getch()conio.hConsoleKhôngKhôngKhông❌ Windows only
getche()conio.hConsoleKhôngCóKhông❌ Windows only

Ví dụ minh họa (Chạy trên Windows với conio.h)

#include 
#include 

int main() {
    printf("Test getc(stdin): ");
    int c1 = getc(stdin);        // Nhập 'A', Enter -> c1 = 'A'
    putchar(c1); putchar('\n');
    
    printf("Test getchar(): ");
    int c2 = getchar();          // Nhập 'B', Enter -> c2 = 'B'
    putchar(c2); putchar('\n');
    
    printf("Test getch() - nhập 1 ký tự (ko hiển thị): ");
    int c3 = getch();            // Nhấn 'C' -> c3 = 'C', KHÔNG in ra màn hình
    printf("\nĐã nhập (từ biến): %c\n", c3);
    
    printf("Test getche() - nhập 1 ký tự (có hiển thị): ");
    int c4 = getche();           // Nhấn 'D' -> in ra 'D' ngay lập tức
    printf("\nĐã nhập (từ biến): %c\n", c4);
    
    return 0;
}

Kết quả mẫu

Test getc(stdin): A
A
Test getchar(): B
B
Test getch() - nhập 1 ký tự (ko hiển thị): 
Đã nhập (từ biến): C
Test getche() - nhập 1 ký tự (có hiển thị): D
Đã nhập (từ biến): D

Lưu ý quan trọng

  • Không phải Java: Đây là hàm C/C++. Java dùng System.in.read(), Scanner, Console.readPassword().
  • conio.h không chuẩn (non-standard), không chạy trên Linux/macOS chuẩn. Trên Linux dùng termios hoặc thư viện ncurses.
  • getch()/getche() thường dùng cho: nhập mật khẩu (getch), menu real-time, game console.
  • Trong C hiện đại, ưu tiên getchar() hoặc fgetc() cho portable code.

Tương đương trong Java

C FunctionJava Equivalent
getchar()System.in.read(), Scanner.next().charAt(0)
getch() (no echo)Console.readPassword() (return char[]), hoặc JLine/JNA
getche() (echo)Scanner.next().charAt(0) (nhưng có buffer, chờ Enter)

Java không có built-in unbuffered console input không echo như getch(). Cần thư viện ngoài (JLine, Lanterna) hoặc JNI.