printf và mẹo tìm string length ko dùng vòng lặp
TIL
720
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

119 bài viết.
1941 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
176 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 4 năm trước
176 46
White
154 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 3 năm trước
154 39
White
117 18
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 3 năm trước
117 18
Bài viết liên quan
White
3 1
Chú ý: Bài viết này trình bày chủ yếu cho CentOS 64 bit, tuy nhiên ý tưởng có thể áp dụng cho các hệ điều hành khác. Cuối bài có ghi chú cho Ubunt...
Ngoc Dao viết hơn 3 năm trước
3 1
White
55 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 4 năm trước
55 23
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
119 bài viết.
1941 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á!