1. getchar là gì?
Hàm getchar
là một trong những phương thức nhập cơ bản trong ngôn ngữ C, cho phép đọc một ký tự từ đầu vào chuẩn (bàn phím). Sau khi người dùng nhập một ký tự, hàm này sẽ trả về mã ASCII của ký tự đó, rất hữu ích khi cần xử lý đơn giản từng ký tự đầu vào. Ví dụ, khi muốn xử lý từng ký tự mà người dùng nhập vào.
Đặc điểm của hàm getchar
- Lấy một ký tự từ đầu vào chuẩn: Chương trình sẽ chờ cho đến khi người dùng nhấn phím Enter sau khi nhập ký tự.
- Trả về mã ASCII: Ký tự được nhập sẽ được trả về dưới dạng mã ASCII. Nếu muốn sử dụng dưới dạng ký tự, cần ép kiểu phù hợp.
getchar
đặc biệt phù hợp cho các chương trình nhập liệu đơn giản hoặc tương tác. So với các hàm nhập khác, getchar
dễ sử dụng nên rất thường gặp trong quá trình học C cơ bản.
Ví dụ sử dụng
Dưới đây là ví dụ đơn giản sử dụng getchar
để nhập một ký tự:
#include <stdio.h>
int main() {
int c;
printf("Nhập một ký tự: ");
c = getchar();
printf("Ký tự đã nhập: %c
", c);
return 0;
}
Trong chương trình này, ký tự mà người dùng nhập từ bàn phím sẽ được lấy ra và hiển thị lại lên màn hình. Ví dụ, nếu nhập “A”, kết quả sẽ như sau:
Nhập một ký tự: A
Ký tự đã nhập: A
2. Cách sử dụng cơ bản của hàm getchar
Cách gọi cơ bản
Hàm getchar
được gọi như sau:
int getchar(void);
Hàm này không nhận đối số, đọc một ký tự và trả về mã ASCII của ký tự đó. Giá trị trả về thuộc kiểu int
; nếu có lỗi hoặc kết thúc tệp, sẽ trả về EOF
(End Of File).
Ví dụ nhập một ký tự đơn giản
Như ví dụ trên, getchar
dùng để lấy một ký tự rồi hiển thị lên màn hình. Trường hợp chỉ cần xử lý từng ký tự, hàm này rất tiện lợi.
#include <stdio.h>
int main() {
int c;
printf("Nhập một ký tự: ");
c = getchar();
printf("Ký tự đã nhập: %c
", c);
return 0;
}
Đoạn mã này sẽ lấy ký tự nhập vào bằng getchar
và in ra nhờ printf
.
3. Ứng dụng của getchar
EOF (Kết thúc tệp) và getchar
Hàm getchar
không chỉ lấy ký tự, mà còn trả về EOF
khi gặp điểm kết thúc nhập. Ví dụ, khi nhập liệu từ file hoặc nhấn “Ctrl+Z” (Windows) hoặc “Ctrl+D” (Unix), có thể phát hiện EOF.
Dưới đây là ví dụ về chương trình đọc liên tục cho đến khi gặp EOF:
#include <stdio.h>
int main() {
int c;
printf("Nhập ký tự (kết thúc bằng EOF): ");
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
Mã này sử dụng getchar
và putchar
để in từng ký tự nhập vào. Nhập tiếp tục cho đến khi gặp EOF.
Nhập nhiều ký tự
Bạn cũng có thể sử dụng getchar
để đọc nhiều ký tự. Trong ví dụ dưới đây, chương trình sẽ hiển thị từng ký tự cho đến khi gặp ký tự xuống dòng.
#include <stdio.h>
int main() {
int c;
printf("Nhập chuỗi ký tự: ");
while ((c = getchar()) != 'n') {
printf("Ký tự nhập vào: %cn", c);
}
return 0;
}
Chương trình này sẽ lấy từng ký tự với getchar
và in ra cho đến khi gặp 'n'
(ký tự xuống dòng).

4. EOF và xử lý bộ đệm
Vai trò của EOF
EOF (End Of File) là ký hiệu kết thúc tệp hoặc kết thúc nhập liệu từ bàn phím. Khi gặp EOF, getchar
sẽ trả về -1
, cho phép chương trình phát hiện và dừng xử lý. Thường gặp EOF khi hết tệp hoặc nhấn tổ hợp phím đặc biệt khi nhập từ bàn phím.
Bộ đệm và getchar
Hàm getchar
sử dụng cơ chế bộ đệm, nghĩa là mọi ký tự nhập vào sẽ lưu trong bộ đệm cho đến khi nhấn Enter. Khi gọi getchar
nhiều lần, mỗi lần sẽ lấy ký tự tiếp theo trong bộ đệm. Vì thế, nếu nhập nhiều ký tự rồi Enter, chương trình sẽ xử lý từng ký tự theo thứ tự.
Để bỏ qua ký tự xuống dòng còn lại trong bộ đệm, có thể xử lý như sau:
#include <stdio.h>
int main() {
int c;
printf("Nhập một ký tự: ");
c = getchar();
while (getchar() != 'n'); // Bỏ qua ký tự xuống dòng còn lại trong bộ đệm
printf("Ký tự nhập vào: %cn", c);
return 0;
}
Đoạn mã này đảm bảo chỉ ký tự người dùng nhập vào được xử lý, ký tự xuống dòng được loại bỏ khỏi bộ đệm.
5. So sánh getchar với các hàm nhập liệu khác
Sự khác biệt giữa getchar và scanf
getchar
và scanf
đều là hàm nhập liệu, nhưng có mục đích và cách sử dụng khác nhau. scanf
cho phép nhập nhiều kiểu dữ liệu như số nguyên, số thực, chuỗi ký tự thông qua định dạng, còn getchar
chỉ lấy duy nhất một ký tự từ đầu vào chuẩn.
Ví dụ nhập bằng scanf:
#include <stdio.h>
int main() {
int num;
printf("Nhập số: ");
scanf("%d", &num);
printf("Số vừa nhập: %dn", num);
return 0;
}
Đoạn mã trên sử dụng scanf
để nhập số nguyên và hiển thị lại. scanf
có thể nhập nhiều kiểu dữ liệu cùng lúc.
Sự khác biệt giữa getchar và fgets
fgets
khác getchar
ở chỗ có thể lấy một chuỗi ký tự (nhiều ký tự) cùng lúc từ đầu vào chuẩn. Hàm này rất tiện khi cần nhập một dòng hoặc chuỗi dài. Ngoài ra, fgets
cho phép giới hạn số ký tự nhập vào, giúp tránh tràn bộ đệm như scanf
.
Ví dụ nhập bằng fgets:
#include <stdio.h>
int main() {
char str[100];
printf("Nhập chuỗi ký tự: ");
fgets(str, sizeof(str), stdin);
printf("Chuỗi đã nhập: %s", str);
return 0;
}
Ở ví dụ này, fgets
được dùng để lấy cả một dòng ký tự và in ra màn hình. fgets
sẽ lấy cả ký tự xuống dòng, rất hữu ích với dữ liệu nhiều dòng.
Khi nào nên dùng getchar, scanf hoặc fgets?
- getchar: Phù hợp khi chỉ cần lấy một ký tự, ví dụ lựa chọn menu hoặc xử lý từng phím nhấn.
- scanf: Phù hợp khi muốn nhập nhiều loại dữ liệu, nhưng cần kiểm tra lỗi khi nhập.
- fgets: Phù hợp khi nhập chuỗi dài hoặc nhiều dòng, đồng thời kiểm soát số lượng ký tự nhập.
6. Ứng dụng thực tiễn của getchar: chương trình tương tác
Hàm getchar
rất hữu ích khi xây dựng chương trình tương tác với người dùng. Sau đây là ví dụ về chương trình xử lý theo phím nhấn, phù hợp làm menu hoặc trò chơi đơn giản.
Ví dụ: menu lựa chọn theo ký tự nhập
#include <stdio.h>
int main() {
char choice;
printf("Chọn menu (a: Xin chào, b: Thoát): ");
choice = getchar();
switch (choice) {
case 'a':
printf("Xin chào!n");
break;
case 'b':
printf("Kết thúc chương trình.n");
break;
default:
printf("Lựa chọn không hợp lệ.n");
}
return 0;
}
Trong ví dụ này, nếu người dùng nhập ‘a’ hoặc ‘b’ sẽ nhận được thông báo tương ứng. Dùng getchar
để xây dựng menu đơn giản và xử lý đầu vào linh hoạt.
Ví dụ nâng cao: xử lý nhiều lệnh nhập vào
Mã sau minh họa cách xử lý nhiều lệnh khác nhau tùy ký tự nhập:
#include <stdio.h>
int main() {
char command;
printf("Nhập lệnh (l: Hiển thị danh sách, h: Chào hỏi, q: Thoát): ");
command = getchar();
switch (command) {
case 'l':
printf("Hiển thị danh sách.n");
break;
case 'h':
printf("Xin chào!n");
break;
case 'q':
printf("Kết thúc chương trình.n");
break;
default:
printf("Lệnh không hợp lệ.n");
}
return 0;
}
Chương trình sẽ thực hiện thao tác tương ứng với từng lệnh ký tự được nhập vào.
7. Lưu ý và best practices khi dùng getchar
Vấn đề thường gặp: xử lý bộ đệm
Một điểm cần chú ý khi dùng getchar
là ký tự xuống dòng còn sót lại trong bộ đệm có thể ảnh hưởng lần nhập tiếp theo. Sau khi gọi getchar
một lần, nếu không xử lý, ký tự xuống dòng có thể bị lấy ở lần getchar
kế tiếp. Để tránh, cần xóa bộ đệm.
Cách bỏ qua ký tự xuống dòng:
#include <stdio.h>
int main() {
int c;
printf("Nhập một ký tự: ");
c = getchar();
while (getchar() != 'n'); // Bỏ qua ký tự xuống dòng
printf("Ký tự nhập vào: %cn", c);
return 0;
}
Đoạn này sẽ lấy một ký tự rồi dùng vòng lặp để bỏ qua ký tự xuống dòng còn lại trong bộ đệm.
Best practices
- Xóa bộ đệm: Luôn đảm bảo ký tự xuống dòng được xử lý để không ảnh hưởng đến lần nhập tiếp theo.
- Xử lý lỗi: Kiểm tra giá trị trả về là
EOF
để xử lý lỗi khi nhập từ file hoặc đầu vào chuẩn. - Giới hạn nhập liệu: Khi cần nhập chuỗi dài hoặc nhiều điều kiện, hãy cân nhắc dùng
fgets
thay vìgetchar
để tránh tràn bộ đệm.
8. Tổng kết và bước tiếp theo
Bài viết này đã trình bày cách sử dụng hàm getchar
từ cơ bản đến nâng cao, cũng như so sánh với các hàm nhập liệu khác như scanf
và fgets
. getchar
là công cụ mạnh mẽ, đơn giản nhưng rất tiện khi cần xử lý nhập liệu từng ký tự hoặc xây dựng chương trình tương tác.
Những kiến thức nên học tiếp theo
- Ứng dụng nâng cao của fgets và scanf: Khi cần nhập chuỗi hoặc số, nên tìm hiểu kỹ cách dùng
fgets
vàscanf
. - Xử lý nhập từ file:
getchar
không chỉ dùng cho đầu vào chuẩn mà còn dùng để đọc dữ liệu từ file. Hiểu rõ về nhập/xuất file sẽ mở rộng ứng dụng của bạn. - Xử lý lỗi thực tế: Học cách kiểm tra và xử lý lỗi khi nhập dữ liệu (đặc biệt với
EOF
hoặc dữ liệu không hợp lệ) giúp chương trình ổn định hơn.
Nắm vững các kiến thức cơ bản này sẽ giúp bạn tự tin xây dựng những chương trình thực tế bằng ngôn ngữ C.