Một ngày khác, tôi thấy mình trong một tình huống %n
sẽ giải quyết tốt vấn đề của tôi. Không giống như câu trả lời trước đây của tôi , trong trường hợp này, tôi không thể nghĩ ra một phương án tốt.
Tôi có một điều khiển GUI hiển thị một số văn bản được chỉ định. Điều khiển này có thể hiển thị một phần của văn bản đó in đậm (hoặc in nghiêng hoặc gạch chân, v.v.) và tôi có thể chỉ định phần nào bằng cách chỉ định các chỉ số ký tự bắt đầu và kết thúc.
Trong trường hợp của tôi, tôi đang tạo văn bản cho điều khiển snprintf
và tôi muốn một trong những thay thế được in đậm. Tìm các chỉ số bắt đầu và kết thúc cho sự thay thế này là không tầm thường bởi vì:
Chuỗi chứa nhiều thay thế và một trong những thay thế là văn bản do người dùng chỉ định. Điều này có nghĩa là thực hiện tìm kiếm văn bản cho sự thay thế mà tôi quan tâm có khả năng mơ hồ.
Chuỗi định dạng có thể được bản địa hóa và nó có thể sử dụng $
phần mở rộng POSIX cho các chỉ định định dạng vị trí. Do đó, việc tìm kiếm chuỗi định dạng ban đầu cho chính các bộ định dạng định dạng là không tầm thường.
Khía cạnh nội địa hóa cũng có nghĩa là tôi không thể dễ dàng chia chuỗi định dạng thành nhiều cuộc gọi đến snprintf
.
Do đó, cách đơn giản nhất để tìm các chỉ số xung quanh một sự thay thế cụ thể sẽ là:
char buf[256];
int start;
int end;
snprintf(buf, sizeof buf,
"blah blah %s %f yada yada %n%s%n yakety yak",
someUserSpecifiedString,
someFloat,
&start, boldString, &end);
control->set_text(buf);
control->set_bold(start, end);