Căn lề trong C | Laptrinhcanban.com

Căn lề trong C

Hướng dẫn cách căn lề trong C. Bạn sẽ học được các cách căn trái, căn phải, căn giữa khi xuất dữ liệu trong C sau bài học này.

Cách căn lề trong C

Để căn lề trong C, chúng ta sử dụng các hàm xuất dữ liệu như printf hoặc sprintf/snprintf kèm với các đối số flags (có tác dụng căn chỉnh, thêm dấu , đệm số 0) và đối số width (chỉ định độ dài tối thiểu của kết quả xuất).

Ví dụ:

printf("%4d", 18);  // "  18"(Căn phải)
printf("%-4d", 18); // "18 "(Căn trái)
printf("%04d", 18); // "0018"(Đệm số 0)

Bảng các flags thông dụng có thể sử dụng trong hàm xuất dữ liệu trong C như sau:

flagsTác dụng
-Căn trái
+Thêm dấu cho số
0Đệm số 0 cho đủ độ dài kết quả xuất
spaceĐệm dấu cách

Căn lề phải trong C

Để căn lề phải trong C, chúng ta thêm độ dài tối thiểu của kết quả xuất vào đằng sau ký hiệu bắt đầu chuỗi định dạng %. Độ dài tối thiểu của kết quả xuất được gọi là đối số width trong hàm xuất dữ liệu trong C.

printf("%4d", 12);   // "  12"
printf("%2d", 1234); // "1234"(Ưu tiên độ dài thực tế của chuỗi)
printf("%4d", -12); // " -12"(Thêm cả dấu trong kết quả)
printf("%9f", 3.14); // " 3.140000"(Thêm cả dấu và chữ số thập phân)

Căn lề trái trong C

Để căn lề trái trong C, ngoài việc thêm độ dài tối thiểu của kết quả xuất vào đằng sau ký hiệu bắt đầu chuỗi định dạng % thì chúng ta cũng cần thêm cả dấu trừ - vào đằng sau ký hiệu % này.

printf("%-4d", 12);   // "12  "
printf("%-4d", -12); // "-12 "
printf("%-+4d", 12); // "+12 "
printf("%-9f", 3.14); // "3.140000 "

Đệm số 0 vào số trong C

Đệm số 0 vào đầu số trong C

Để đệm số 0 vào đầu số trong C, ngoài việc thêm độ dài tối thiểu của kết quả xuất vào đằng sau ký hiệu bắt đầu chuỗi định dạng % thì chúng ta cũng cần thêm cả số 0 vào đằng sau ký hiệu % này.

printf("%04d", 12);    // 0012
printf("%08d", 12); // 00000012
printf("%09f", 3.14); // 03.140000

Đệm số 0 vào cuối số trong C

Về mặc định khi dùng hàm printf() kèm flags 0 giống như trên, thì chúng ta chỉ có thể đệm số 0 vào đầu số trong C mà thôi.

Tuy nhiên nếu sử dụng kèm hàm snprintf() để tạo chuỗi kết quả có số 0 được đệm vào cuối số trước khi in nó ra bằng hàm printf(), chúng ta có thể giải quyết được bài toán này.

Ví dụ:

#include <stdio.h>

int main(void){
char num[5];
snprintf(num, 5, "%04d", 12);
printf("%s", num); // num == "0012"
printf("%8s", num); // " 0012"
printf("%-8s", num); // "0012 "
}

Lưu ý khi đệm số 0 vào chuỗi trong C

Chúng ta chỉ có thể đệm số 0 vào số trong C mà thôi. Chúng ta không thể đệm số 0 vào các đối tượng khác, ví dụ như chuỗi chẳng hạn. Mặc dù không xảy ra lỗi, nhưng kết quả hiện về sẽ không bao gồm số 0.

Ví dụ:

printf("%08s", "abc");    //"     abc"
printf("%08s", "12"); //" 12"
printf("%08s", "12.34"); //" 12.34"

Để giải quyết vấn đề này, chúng ta cần phải chuyển các chữ số này về kiểu số bằng cách dùng các hàm như atoi,atof,atol, rồi mới tiến hành đệm số 0 vào đầu số đó.
Ví dụ:

#include <stdio.h>
#include <stdlib.h>
int main(void){
printf("%08d", atoi("12")); //"00000012"
printf("%08f", atof("12.34")); //"12.340000"
return 0;
}

Chỉ định động độ dài tối thiểu của chuỗi kết quả

Như ở phần trên chúng ta đã học được cách chỉ định cố định độ dài tối thiểu của chuỗi kết quả vào đằng sau dấu %. Tuy nhiên cách này có một số bất cập khi chúng ta muốn thay đổi giá trị của độ dài tối thiểu này.

Khi đó, chúng ta cần dùng tới cách chỉ định động độ dài tối thiểu của chuỗi kết quả, bằng cách gán dấu hoa thị * vào trước ký hiệu %, sau đó mới chỉ định giá trị của độ dài tối thiểu của chuỗi kết quả.

Ví dụ:

printf("%*s", 4, "12"); // "  12"
printf("%0*d", 4, 12); // "0012"

Chúng ta cũng có thể gán độ dài tối thiểu vào một biến để tiện sử dụng hơn trong chương trình. Ví dụ:

int x = 4;
printf("%*s", x, "12"); // " 12"
printf("%0*d", x, 12); // "0012"

Chú ý khi căn lề trong C

Ưu tiên độ dài thực của chuỗi khi in

Khi chỉ định độ dài tối thiểu của chuỗi kết quả, nếu giá trị này nhỏ hơn độ dài thực của chuỗi được in, thì độ dài thực của chuỗi sẽ được ưu tiên.

Ví dụ:

printf("%3d", 1234); // "1234"
printf("%4d", 1234); // "1234"
printf("%5d", 1234); // " 1234"

Lưu ý là các dấu cộng trừ trước số cũng được tính trong độ dài chuỗi, và với số thực thì phần số thập phân cũng được bao hàm trong độ dài này.

Ví dụ:

printf("%4d", -12);  // " -12"
printf("%9f", 3.14); // " 3.140000"
printf("%7.2f", 3.14); // " 3.14"

Không thể cùng lúc đệm số 0 và căn lề trái

Chúng ta không thể cùng lúc đệm số 0 và căn lề trái trong C được. Khi đó flag 0 sẽ bị bỏ qua, và flag căn lề trái - sẽ được ưu tiên xử lý.

/*Kết quả không phải là "1200" do flag 0 bị bỏ qua*/
printf("%-04d", 12); // "12 "

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách căn lề trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.