Thao tác Input / Output trong C – Web888 chia sẻ kiến thức lập trình, kinh doanh, mmo

Tại sao lại đưa bài tao tác input output lên trước các bài khái niệm tiếp theo ? Vì để dễ dàng thực hành trong quá trình lmà bài tập tập, mình sẽ đi tới input/output và giới thiệu cách nhập xuất cơ bản trước, mặc dù chúng ta chưa hiểu rõ khái niệm về hàm, nhưng cứ xài nó trước đi đã, rồi đi vào khái niệm sau.

Chương trình C cung cấp một bộ thư viện chuẩn để làm việc với các hàm nhập xuất, nhập là đưa dữ liệu từ thiết bị ngoại vi vào, trong ngữ cảnh ngôn ngữ lập trình C là bàn phím, xuất là đưa dữ liệu từ máy tính ra, ngữ cảnh này là in ra màn hình.

Output – In ra màn hình với hàm printf

Trong lập trình C, printf() là một trong những hàm xuất in dữ liệu ra màn hình chính. Hàm này được định nghĩa trong thư viện có tên <stdio.h>, để sử dụng nó chúng ta đưa thư viện chuẩn vào theo cú pháp

#include stdio.h

Ví dụ

#include stdio.h
int main()
{
// in dòng hello world ra màn hình
printf("hello world");
return 0;
}

Kết quả được in ra màn hình:

hello world

Luồng chạy chương trình:

  1. Đưa thư viện stdio.h vào
  2. Khi thực thi mã nguồn, chương trình C gọi hàm main để thực thi
  3. Trong hàm main gọi tới (thực thi) hàm printf (in ra màn hình dòng chữ hello world)
  4. return 0 để kết thúc chương trình.

Tại sao lại return 0 cuối hàm main ? sẽ được đề cập trong bài viết khái niệm hàm. Trong ngữ cảnh này, chúng ta khai báo hàm main kiểu dữ liệu int, vì vậy cuối hàm cần return 0 để trả về giá trị cho hệ điều hành và kết thúc chương trình. Nếu không muốn return 0 ở cuối chương trình, khai báo kiểu dữ liệu void cho hàm main()

Cú pháp hàm printf

printf("control string",argument list);
// controlstring: chuỗi điều khiển
// argument list: danh sách tham số

Định dạng dữ liệu (Format Sepcifier)

Xét ví dụ dưới là câu lệnh in dữ liệu số ra màn hình

#include 
int main()
{
int testInteger = 5;
printf("Number = %d", testInteger);
return 0;
}

Kết quả:

Number = 5

Input – Nhập dữ liệu với hàm scanf

Trong ngôn ngữ C, hàm scanf được dùng để nhận dữ liệu mà người dùng nhập vào từ bàn phím. Hàm này sẽ đọc dữ liệu từ bàn phím nhập vào theo đúng định dạng mà lập trình viên quy ước tương tự cấu trúc định dạng chu ta đã tiếp cận ở hàm printf.

Cú pháp hàm scanf

scanf("format specifier list",argument list);
// format specifier list: chuỗi bộ định dạng
// argument list: danh sách tham số

Xem ví dụ dưới đây:

#include 
int main()
{
int testInteger;
printf("Enter an integer: ");
scanf("%d", &testInteger);
printf("Number = %d",testInteger);
return 0;
}

Giả sử bạn nhập số 4 thì kết quả có dạng như sau:

Enter an integer: 4
Number = 4

Ở đây mình sử dụng format là %d vì mong muốn dữ liệu nhập vào là một số nguyên.

Ví dụ: Float Double Input/Output

#include 
int main()
{
float num1;
double num2;
printf("Enter a number: ");
scanf("%f", &num1);
printf("Enter another number: ");
scanf("%lf", &num2);
printf("num1 = %fn", num1);
printf("num2 = %lf", num2);
return 0;
}

Kết quả:

Enter a number: 12.523
Enter another number: 10.2
num1 = 12.523000
num2 = 10.200000

Chúng ta sử dụng %f%fl để định dạng cho kiểu float và double.

Ví dụ: Character

#include 
int main()
{
char chr;
printf("Enter a character: ");
scanf("%c",&chr);
printf("You entered %c.", chr);
return 0;
}

Kết quả:

Enter a character: g
You entered g

Lưu ý: sự khác biệt rõ ràng giữa hàm printf và scanf là cách sử dụng danh sách tham số, với printf chúng ta truyền danh sách tham số vào bằng tên biến, còn với scanf chúng ta cần bổ sung thêm ký tự & đằng trước tên biến, đây là khái niệm vị trí vùng nhớ (memory address) sẽ được đề cập chi tiết ở bài con trỏ. ( Ở bài viết đó mình cũng sẽ giải thích thêm lý do vì sao riêng trường hợp %s trong scanf thể truyền trực tiếp tên biến làm tham số mà không cần dùng & mà vẫn hợp lệ)

Nhập xuất nhiều dữ liệu cùng lúc thông qua danh sách tham số ( argument list)

Bạn có thể nhập xuất nhiều dữ liệu cùng lúc bằng cách truyền thêm tham số vào hai hàm printf và scanf, và đương nhiên định dạng format bạn cũng phải nhập đầy đủ tương đương, khớp cả về thứ tự, số lượng, và kiểu dữ liệu của biến tham số.

Xem ví dụ sau, mình đã dùng hàm scanf và hàm printf để in hai biến cùng lúc.

#include 
int main()
{
int a;
float b;
printf("Enter integer and then a float: ");
// Taking multiple inputs
scanf("%d%f", &a, &b);
printf("You entered %d and %f", a, b);
return 0;
}

Kết quả:

Enter integer and then a float: -3
3.4
You entered -3 and 3.400000

Lưu ý: khi sử dụng hàm scanf, chuỗi bộ định dạng được viết liền kề nhau, không có khoảng trắng, hằng số chuỗi ở giữa, ví dụ:

scanf("%s %d",&a,&b) // sai
scanf("%s va %d",&a,&b) // sai
scanf("%s%d",&a,&b) // đúng

Bảng lệnh định dạng dữ liệu (format specifier)

Định dạngprintf()scanf()Ký tự (char)%c%cSố nguyên (decimal)%d%dSố thực (float)%f%fSố thực (double)%lf%fmảng ký tự/chuỗi (array character/string)%s%sSố thập phân với dấu chấm động%e%e hoặc %fSố nguyên không dấu (unsign)%u%uSố thập lục phân không dấu (unsign hexadecimal integer)%x%xSố bát phân không dấu (unsign octal integer)%o%oVới khuôn khổ tiếp cận, các kiểu dữ liệu phổ biến nhất chúng ta thường sử dụng là: %c,%d,%f,%s