Nếu tôi muốn có một chương trình để có nhiều định dạng đầu ra văn bản, tôi có thể làm một cái gì đó như thế này:Có mã "printf" không in bất kỳ thứ gì, được sử dụng để bỏ qua một tham số không?
const char *fmtDefault = "%u x %s ($%.2f each)\n";
const char *fmtMultiLine = "Qty: %3u\nItem: %s\nPrice per item: $%.2f\n\n";
const char *fmtCSV = "%u,%s,%.2f\n";
const char *fmt;
switch (which_format) {
case 1: fmt = fmtMultiLine; break;
case 2: fmt = fmtCSV; break;
default: fmt = fmtDefault;
}
printf(fmt, quantity, item_description, price);
Kể từ khi giá được quy định cuối cùng, tôi cũng có thể thêm một điều đó không có niêm yết giá:
const char *fmtNoPrices = "%u x %s\n";
Nhưng nếu tôi muốn bỏ qua số lượng thay thế thì sao? Nếu tôi đã làm điều này:
const char *fmtNoQuantity = "The price of %s is $%.2f each.\n";
khi đó hành vi không xác định (có thể là segfault) sẽ xảy ra thay vì những gì tôi muốn. Điều này là bởi vì nó sẽ xử lý tham số đầu tiên như một con trỏ tới một chuỗi, mặc dù nó thực sự là một int không dấu. Int unsigned này rất có thể trỏ đến một cái gì đó khác với dữ liệu chuỗi hợp lệ, hoặc (nhiều khả năng, đặc biệt nếu bạn không mua hàng trăm triệu cùng một mục) một vị trí bộ nhớ không hợp lệ, dẫn đến lỗi phân đoạn.
Những gì tôi muốn biết là nếu có một mã tôi có thể đặt ở đâu đó (%Z
trong ví dụ này) để nói với nó để bỏ qua tham số đó, như thế này:
const char *fmtNoQuantity = "%ZThe price of %s is $%.2f each.";
scanf() có thể sử dụng dấu hoa thị, nhưng không thể in được IIRC printf(). Tôi cũng đã thử sử dụng '.0' độ chính xác specifiers, nhưng điều này dường như chỉ hoạt động trên chuỗi ('% .0s' sẽ hiển thị không có gì, nhưng có thể vẫn dereference con trỏ nếu không null) – Medinoc
Bạn nên sử dụng bộ riêng biệt của các cuộc gọi với danh sách đối số riêng biệt, tôi nghĩ. Làm cách khác làm cho quốc tế hóa (I18N) khó khăn hơn nhiều. –