printf và mẹo tìm string length ko dùng vòng lặp
TIL
608
C
29
code
39
White

Huy Trần viết ngày 07/11/2016

Nếu các bạn học C thì đều biết, để tìm độ dài một string kiểu char *, chúng ta phải dùng vòng lặp:

int len(char* s) {
  for (int i = 0; s[i] != '\0'; ++i);
  return i;
}

Hoặc dùng hàm strlen trong thư viện string.h:

int len = strlen(s);

Bây giờ mình sẽ giới thiệu thêm một cách khác nữa, cũng khá là fun, đó là sử dụng hàm printf.

Đặc tính của hàm printf là nó sẽ trả về một giá trị, đó là số kí tự mà nó đã in ra, ví dụ:

int len = printf("kimochi");

Giá trị của biến len sẽ là 7, là độ dài của chuỗi kimochi. Vậy chúng ta có thể dùng printf để tìm độ dài của một chuỗi rồi.

Nhưng có một vấn đề đó là printf mặc định sẽ luôn in nội dung ra màn hình (STDOUT), vậy làm sao để tính được độ dài của chuỗi mà không cần in chuỗi đó ra màn hình?

printf thực chất là macro của hàm fprintf với tham số đầu tiên (là output stream) có giá trị bằng STDOUT, tức là in ra thiết bị xuất mặc định, ở đây là cửa sổ dòng lệnh đang chạy. Ta chỉ việc thay nó bằng một stream nào đó mà không cần hiển thị ra màn hình là được.

Trên các máy chạy hệ điều hành unix-like như Linux hay MacOS thì ta có /dev/null là một output stream có nhiệm vụ không làm gì cả, mọi thứ ghi vào đây sẽ biến mất, như kiểu lỗ đen vũ trụ ấy :v vậy nên ta có thể chọn cách sử dụng hàm fprintf để ghi vào /dev/null, ta thực hiện việc này như sau:

Đầu tiên, dùng hàm fopen để mở file /dev/null với chế độ ghi

FILE* devnull = fopen("/dev/null", "w");

Truyền file descriptor của /dev/null vào hàm fprintf để lấy giá trị trả về

int len = fprintf(devnull, "%s", s);

Cách này tuy hơi rườm rà nhưng cũng có thể gọi là hữu ích nếu bạn lười import các thể loại thư viện khác nhau vào chương trình giống như mình :v

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Huy Trần

111 bài viết.
1620 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
160 46
Tại sao phải viết blog kĩ thuật? Có rất nhiều bài viết trên mạng nói về vấn đề tại sao một lập trình viên nên thường xuyên viết các bài blog kĩ thu...
Huy Trần viết 3 năm trước
160 46
White
149 39
(Ảnh) Tiếp tục sêri (Link) lần này, chúng ta sẽ cùng tìm hiểu và mô phỏng lại một chức năng mà mọi người đang bắt đầu sử dụng hằng ngày, đó là chứ...
Huy Trần viết 2 năm trước
149 39
White
106 17
Phần 1: Tự truyện Tui và Toán đã từng là hai kẻ thù không đội trời chung trong suốt hơn mười lăm năm ròng rã. Ngay từ ánh nhìn đầu tiên đã ghét nh...
Huy Trần viết hơn 2 năm trước
106 17
Bài viết liên quan
White
0 2
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 2 tháng trước
0 2
White
53 23
Luận về comment code (Phong cách kiếm hiệp) Comment code luôn là vấn đề gây tranh cãi sứt đầu mẻ trán trong giới võ lâm. Xưa kia, thuở còn mài đít...
Huy Hoàng Phạm viết gần 3 năm trước
53 23
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
111 bài viết.
1620 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!