2012-03-30 69 views
8

%*d là gì? Tôi biết rằng %d được sử dụng cho integers, vì vậy tôi nghĩ rằng %*d cũng phải liên quan đến số nguyên chỉ? công dụng của nó là gi? Nó làm gì?Sự khác biệt giữa% d và% * d trong ngôn ngữ c là gì?

int a=10,b=20; 
printf("\n%d%d",a,b); 
printf("\n%*d%*d",a,b); 

Kết quả là

10 20 
1775 1775 
+4

Trông giống như trình chỉ định độ rộng: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ – Mysticial

+2

@Mysticial Bạn nên viết câu trả lời đó là – Ben

+0

@Ben, nó chỉ là một liên kết - mà không không đủ điều kiện làm câu trả lời. Tôi quá lười biếng để mở rộng nó ... – Mysticial

Trả lời

10

Khi sử dụng với scanf() chức năng, nó có nghĩa là một số nguyên được phân tách, nhưng kết quả không được lưu trữ ở bất cứ đâu.

Khi được sử dụng với hàm printf(), điều đó có nghĩa là đối số chiều rộng được chỉ định bởi đối số định dạng tiếp theo.

5

Các * được sử dụng như một dấu hiệu cho thấy chiều rộng được thông qua như là một tham số của printf

+1

Vậy tại sao nó tạo ra đầu ra 1775 1775? – Parag

+1

printf là một hàm đối số biến, vì vậy khi chuỗi định dạng được phân tích cú pháp, nó sẽ tìm một số nguyên đại diện cho chiều rộng của giá trị đầu tiên, giá trị chính nó, chiều rộng của giá trị thứ hai và giá trị thứ hai. Vì bạn chỉ chuyển 2 giá trị, các giá trị được sử dụng không xác định. Thử sử dụng 4 giá trị có ý nghĩa và xem kết quả. – guga

17

Các %*d trong một printf cho phép bạn sử dụng một biến để điều chỉnh độ rộng lĩnh vực, dọc theo dòng:

int wid = 4; 
printf ("%*d\n", wid, 42); 

mà sẽ cung cấp cho bạn:

..42 

(với mỗi người 0.123.ký tự là không gian). * tiêu thụ một đối số widd tiêu thụ 42.

Các hình thức bạn có, như:

printf ("%*d %*d\n", a, b); 

là hành vi không xác định theo tiêu chuẩn, kể từ khi bạn cần phải cung cấp Bốn lập luận sau chuỗi định dạng, không phải là hai (và trình biên dịch tốt như gcc sẽ cho bạn về điều này nếu bạn tăng mức cảnh báo). Từ C11 7.20.6 Formatted input/output functions:

Nếu không có đủ đối số cho định dạng, hành vi không xác định.

Nó phải là một cái gì đó như:

printf ("%*d %*d\n", 4, a, 4, b); 

Và lý do bạn nhận được đầu ra kỳ lạ là do rằng hành vi không xác định. This excellent answer cho bạn thấy những thứ có thể sai (và tại sao) khi bạn không tuân thủ các quy tắc, đặc biệt là liên quan đến tình huống này.

Bây giờ, tôi không ngờ đây là vấn đề không chính xác vì bạn đang sử dụng int cho tất cả các loại dữ liệu, như với tất cả các hành vi chưa xác định, mọi thứ.

+1

+1 cho "Câu trả lời xuất sắc này" ... :) – guga

+0

Giải thích tốt. :) – barnes

Các vấn đề liên quan