Tôi nhận được một đoạn mã trong đó có
printf("%.*s\n")
những gì hiện các %.*s
nghĩa là gì?
Tôi nhận được một đoạn mã trong đó có
printf("%.*s\n")
những gì hiện các %.*s
nghĩa là gì?
Câu trả lời:
Bạn có thể sử dụng dấu hoa thị ( *
) để chuyển mã định nghĩa / độ chính xác chiều rộng printf()
, thay vì mã hóa cứng nó vào chuỗi định dạng, tức là
void f(const char *str, int str_len)
{
printf("%.*s\n", str_len, str);
}
str_len
đối số phải có kiểu int
(hoặc kiểu tích phân hẹp hơn, sẽ được thăng cấp thành int
). Nó sẽ là một lỗi để vượt qua long
, size_t
vv
%s
, là để in một chuỗi con của chuỗi gốc. Trong trường hợp sử dụng này, str
sẽ trỏ đến một nơi nào đó bên trong chuỗi gốc (có thể ở đầu) và str_len
sẽ chỉ định độ dài của chuỗi con sẽ được in.
Chi tiết hơn tại đây .
giá trị số nguyên hoặc
*
chỉ định độ rộng trường tối thiểu. Kết quả được đệm bằng các ký tự khoảng trắng (theo mặc định), nếu được yêu cầu, ở bên trái khi căn phải hoặc ở bên phải nếu căn trái. Trong trường hợp khi * được sử dụng, chiều rộng được chỉ định bởi một đối số bổ sung kiểu int. Nếu giá trị của đối số là âm, nó dẫn đến - cờ được chỉ định và độ rộng trường dương. (Lưu ý: Đây là chiều rộng tối thiểu: Giá trị không bao giờ bị cắt ngắn.)
.
theo sau là số nguyên hoặc *, hoặc không chỉ định độ chính xác của chuyển đổi. Trong trường hợp khi * được sử dụng, độ chính xác được chỉ định bởi một đối số bổ sung kiểu int. Nếu giá trị của đối số này là âm, nó sẽ bị bỏ qua. Nếu cả số và * đều không được sử dụng, độ chính xác được coi là 0. Xem bảng dưới đây để biết chính xác ảnh hưởng của độ chính xác.
Vì vậy, nếu chúng tôi thử cả hai đặc điểm kỹ thuật chuyển đổi
#include <stdio.h>
int main() {
int precision = 8;
int biggerPrecision = 16;
const char *greetings = "Hello world";
printf("|%.8s|\n", greetings);
printf("|%.*s|\n", precision , greetings);
printf("|%16s|\n", greetings);
printf("|%*s|\n", biggerPrecision , greetings);
return 0;
}
chúng tôi nhận được đầu ra:
|Hello wo|
|Hello wo|
| Hello world|
| Hello world|
Tôi không nghĩ rằng đoạn mã trên là chính xác nhưng (theo mô tả này của printf()
) .*
phương tiện
Chiều rộng không được chỉ định trong chuỗi định dạng, nhưng là một đối số giá trị số nguyên bổ sung trước đối số phải được định dạng. '
Vì vậy, đó là một chuỗi có độ rộng có thể truyền được làm đối số.
int
(hoặc một tập hợp con của nó) - không chỉ là bất kỳ giá trị tích phân nào như trực quan hơn size_t
hoặc bí danh có thể có của nó, chẳng hạn std::string::size_type
. Điều này thậm chí còn khó hiểu hơn, có tính đến việc trang được tham chiếu đề cập đến size_t
là một trong các mã định nghĩa loại được hỗ trợ.
Xem: http://www.cplusplus.com/reference/clibrary/cstdio/printf/
.*
Độ chính xác không được chỉ định trong chuỗi định dạng, nhưng là đối số giá trị số nguyên bổ sung trước đối số phải được định dạng.
s
Chuỗi ký tự
printf
cuộc gọi hợp lệ .