2012-05-13 52 views
12

Tôi có một chuỗi định dạng như thế này:Làm thế nào tôi có thể in cùng một biến thành một chuỗi nhiều lần?

buf[] = "A%d,B%d,C%d,D%d,F%d,G%d,H%d,I%d,J%d"; 

và tôi muốn chèn số nguyên tương tự cho mỗi %d vì vậy tôi sử dụng:

int val = 6; 
sprintf(buf2, buf, val,val,val,val,val,val,val,val,val); 

Tôi có thể sử dụng sprintf trong một cách mà chỉ yêu cầu tôi để viết val một lần và sprintf sẽ sử dụng nó cho mỗi %d?

Trả lời

15

Có, bạn có thể sử dụng %1$d mọi lúc. Các 1$ tham chiếu các đối số thứ hai, bạn rõ ràng có thể làm điều đó với các đối số khác, quá.

Demo: http://codepad.org/xVmdJkpN

Lưu ý rằng vị trí specifier là một phần mở rộng POSIX - vì vậy nó có thể không hoạt động với tất cả các trình biên dịch duy nhất. Nếu bạn cần nó để làm việc, ví dụ: với trình biên dịch Visual C++, hãy xem xét sử dụng cách xấu xí để lặp lại đối số hoặc không sử dụng chức năng kiểu printf nào cả. Một tùy chọn khác sẽ sử dụng triển khai sprintf tương thích POSIX hoặc sử dụng nhiều cuộc gọi để nối thêm một số vào một vòng lặp (trong trường hợp chuỗi định dạng được tạo động sẽ ngăn bạn chỉ định số đối số chính xác).


Trên mặt chú thích, sprintf cần tránh. Sử dụng snprintf(buf2, sizeof(buf2), ....) để thay thế. Tất nhiên điều này yêu cầu buf2 để có kích thước tĩnh được biết đến lúc biên dịch - nhưng nếu bạn phân bổ nó theo cách thủ công, bạn có thể chỉ cần sử dụng biến chứa độ dài thay vì sizeof(buf2).

+0

Đây có phải là tiêu chuẩn C không? –

+0

Bạn đã đúng lần đầu tiên: sử dụng '% 1 $ d' vì' val' là đối số đầu tiên cho chuỗi định dạng. –

+0

Lợi ích của việc sử dụng dấu vân tay trên sprintf là gì? – Rhexis

5

Không có cách nào tiêu chuẩn (tức là di động) để thực hiện việc này.

+0

OP đã làm rõ ràng không yêu cầu một cách tiêu chuẩn hóa mặc dù. Tôi không nghĩ rằng có một lý do thực sự tốt để không sử dụng bất kỳ phần mở rộng hữu ích hiện nay chỉ vì họ không có trong tiêu chuẩn. Đặc biệt là nếu bạn không viết một số thư viện siêu tuyệt vời, mọi người sẽ sớm sử dụng! – ThiefMaster

+0

@ThiefMaster: Nhưng anh cũng không chỉ định một nền tảng cụ thể. Phần mở rộng POSIX không hoạt động trong Visual C++, ví dụ. –

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