Câu trả lời:
snprintf () sẽ không viết nhiều hơn <size> (đối số 2d của snprintf) vào bộ đệm của bạn, nhưng nó sẽ tính (và loại bỏ các ký tự phụ) mà nó đã viết, đã có đủ khoảng trống và đó là số mà nó trả về . Vâng, nó có thể gây nhầm lẫn!
snprintf
với một bộ đệm rất nhỏ, lưu ý số được trả về, sau đó malloc
là bộ đệm có kích thước phù hợp và làm lại. Bằng cách đó bạn biết có bao nhiêu byte để phân bổ.
snprintf
không có bất kỳ bộ đệm nào (một con trỏ đích null được mô tả rõ ràng là một đối số hợp lệ cho trường hợp Destlength == 0) khi đo chiều dài.
Một bản phác thảo thử nghiệm cho Arduino Uno:
char buffer[10];
void setup() {
Serial.begin(9600);
int n = snprintf(buffer, 2, "hello");
Serial.println(n);
Serial.println(buffer);
}
void loop() {
}
Như @JRobert đã viết, "sẽ có" là chìa khóa. Theo như tôi biết chỉ snprintf và vsnprintf trả về số "sẽ có".
Tôi nghĩ lý do là để có thể biết nếu chuỗi bị cắt ngắn. Giả sử tham số 'size' là 25 và chuỗi định dạng rất dài, thì giá trị trả về có thể được kiểm tra theo 25. Nếu giá trị trả về là 26 (số byte "sẽ có"), thì chuỗi bị cắt ngắn.
Thông tin này không thể truy xuất khi số "sẽ có" không có sẵn.
Để hoàn thành, trang man cho fprintf
các trạng thái:
Hàm snprintf () sẽ tương đương với sprintf (), với việc thêm đối số n trong đó nêu kích thước của bộ đệm được gọi bởi s. Nếu n bằng 0, không có gì được viết và s có thể là con trỏ null. Mặt khác, các byte đầu ra ngoài n ‐ 1st sẽ bị loại bỏ thay vì được ghi vào mảng và một byte null được ghi ở cuối các byte thực sự được ghi vào mảng.
và, có liên quan hơn:
Sau khi hoàn thành thành công, hàm snprintf () sẽ trả về số byte được ghi vào s có n đủ lớn, ngoại trừ byte null kết thúc.
asdf
có chứa "xin chào" hoặc "h" không? Nếu nó chứa "h" thì tham số không bị bỏ qua.