2011-10-26 40 views
70

tôi nhận được một đoạn mã trong đó có một"%. * S" có nghĩa là gì trong printf?

printf("%.*s\n") 

những gì hiện các %.*s nghĩa là gì?

+20

Nếu không có lập luận thêm, đó không phải là một 'gọi printf' hợp lệ. –

Trả lời

75

Bạn có thể sử dụng một dấu sao (*) để vượt qua chiều rộng specifier/độ chính xác để printf(), chứ không phải là cứng mã hóa nó vào chuỗi định dạng, ví dụ:

void f(const char *str, int str_len) 
{ 
    printf("%.*s\n", str_len, str); 
} 
+1

Cần lưu ý rằng đối số 'str_len' phải có kiểu' int' (hoặc loại tích phân hẹp hơn, sẽ được tăng lên 'int'). Nó sẽ là một lỗi để truyền 'long',' size_t', v.v. –

+2

Điều đáng nói đến là mục đích có khả năng của mã này, đặc biệt khi được sử dụng với '% s', là in 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 ban đầu (có thể ở đầu), và' str_len' sẽ xác định chiều dài của chuỗi con sẽ được in. –

11

Tôi không nghĩ rằng đoạn code trên là chính xác nhưng (theo mô tả này của printf()) các .* nghĩa

chiều rộng không được quy định trong chuỗi định dạng, nhưng như là một đối số giá trị số nguyên thêm trước lập luận rằng có phải được định dạng.'

Vì vậy, đó là chuỗi có chiều rộng có thể vượt qua làm đối số.

+2

Tôi đã thêm URL tham chiếu chéo để bạn có thể tránh bị tính phí đạo văn. Tất nhiên, báo giá chính xác cho biết "The _precision_ is not ..." thay vì "_width_ is not…". –

+0

Khi @MattMcNabb chỉ ra, mọi tham chiếu đến trang đó phải làm nổi bật rằng “* giá trị nguyên *” là chính xác 'int' (hoặc một tập con của nó) - không chỉ bất kỳ giá trị tích phân nào giống như' size_t' trực quan hơn hoặc bí danh có thể có của nó , như '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 kiểu số được hỗ trợ. –