Khi nói về Đầu Vào (Input), nó có nghĩa là cung cấp dữ liệu vào một chương trình. Input có thể được đưa vào dưới dạng tệp (file) hoặc từ dòng lệnh (command line). Lập trình C cung cấp sẵn một tập các hàm để đọc input và đưa cho chương trình theo yêu cầu.
Còn khi chúng ta nói Đầu Ra (Output), nó có nghĩa là hiển thị dữ liệu lên màn hình (screen), máy in (printer) hoặc trong bất kỳ file nào. Lập trình C cung cấp sẵn một tập các hàm để output dữ liệu ra màn hình máy tính cũng như lưu dữ liệu dưới dạng file text hoặc binary.
Các File Chuẩn (The Standard Files)
Lập trình C xem tất cả thiết bị (device) dưới dạng tệp (file). Vì vậy, các thiết bị như màn hình được dùng giống như file, và ba file sau đây được tự động mở khi một chương trình thực thi để cung cấp quyền truy cập vào bàn phím (keyboard) và màn hình (screen).
Standard File | File Pointer | Device | |
Standard input | stdin | Keyboard | |
Standard output | stdout | Screen | |
Standard error | stderr | Screen |
Con trỏ file (file pointer) là phương tiện để truy cập file dùng cho mục đích đọc (read) và ghi (write). Phần sau giải thích cách đọc giá trị từ màn hình và cách in giá trị lên màn hình.
Hàm getchar() và putchar()
Hàm int getchar(void) đọc ký tự (character) có sẵn tiếp theo từ màn hình và trả về nó dưới dạng số nguyên (integer). Hàm này chỉ đọc một ký tự tại một thời điểm. Bạn có thể sử dụng phương pháp này trong vòng lặp trong trường hợp bạn muốn đọc nhiều hơn một ký tự từ màn hình.
Hàm int putchar(int c) đưa ký tự c được truyền vào lên màn hình và trả về ký tự tương tự. Hàm này chỉ đặt một ký tự tại một thời điểm. Bạn có thể sử dụng phương pháp này trong vòng lặp trong trường hợp bạn muốn hiển thị nhiều hơn một ký tự trên màn hình. Kiểm tra ví dụ sau:
#include <stdio.h> int main( ) { int c; printf( "Enter a value :"); c = getchar( ); printf( "\nYou entered: "); putchar( c ); return 0; }
Khi đoạn mã trên được biên dịch và thực thi, nó sẽ đợi bạn nhập văn bản (text). Khi bạn nhập một văn bản và nhấn enter, chương trình sẽ thực hiện và đọc một ký tự duy nhất rồi hiển thị nó như sau:
$./a.out Enter a value : this is test You entered: t
Hàm gets() và puts()
Hàm char *gets(char *s) đọc một dòng từ stdin vào bộ đệm (buffer) được trỏ bởi s đến khi bị dừng bởi newline (xuống dòng) hoặc EOF (End of File – Kết thúc File).
Hàm int puts(const char *s) ghi chuỗi s tiếp nối vị trí hiện tại ra stdout.
LƯU Ý: Thay vì sử dụng hàm gets(), bạn có thể sử dụng hàm fgets().
#include <stdio.h> int main( ) { char str[100]; printf( "Enter a value :"); gets( str ); printf( "\nYou entered: "); puts( str ); return 0; }
Biên dịch và thực thi đoạn code trên, chương trình sẽ đợi bạn nhập một số văn bản. Sau khi bạn nhập một văn bản và nhấn enter, chương trình sẽ tiếp tục và đọc hết dòng cho đến khi cuối dòng, và hiển thị nó như sau:
$./a.out Enter a value : this is test You entered: this is test
Hàm scanf() và printf()
Hàm int scanf(const char *format, …) đọc input từ stream input chuẩn stdin và quét input đó theo định dạng format được cung cấp.
Hàm int printf(const char *format, …) ghi output ra stream output chuẩn stdout và xuất ra output theo định dạng format được cung cấp.
Định dạng format có thể là một chuỗi hàng (constant string) đơn giản, nhưng bạn có thể chỉ định bằng %s, %d, %c, %f, v.v., tương ứng để in hoặc đọc chuỗi (string), số nguyên (integer), ký tự (character) hoặc số thập phân (float). Có sẵn nhiều định dạng khác có thể được dùng tùy theo nhu cầu. Chúng ta hãy xem ví dụ sau để hiểu khái niệm cụ thể hơn.
#include <stdio.h> int main() { char str[100]; int i; printf( "Enter a value :"); scanf("%s %d", str, &i); printf( "\nYou entered: %s %d ", str, i); return 0; }
Sau khi đoạn code trên được biên dịch và thực thi, nó sẽ đợi bạn nhập văn bản. Khi bạn nhập một văn bản và nhấn enter, chương trình sẽ tiến hành, đọc input và hiển thị nó như sau.
$./a.out Enter a value : seven 7 You entered: seven 7
Ở đây, cần chú ý rằng scanf() yêu cầu nhập input giống với định dạng mà bạn đã cun cấp %s và %d, có nghĩa là bạn phải nhập đúng dạng input như “string integer”. Nếu bạn nhập “string string” hoặc “integer integer”, thì chương trình sẽ xem như input sai. Thứ hai, trong khi đọc một string, scanf() dừng đọc mỗi khi nó bắt gặp một dấu cách (space), cho nên “this is test” là ba string đối với scanf().