Các chức năng thư viện C chuẩn strtof
và strtod
có chữ ký sau đây:Tại sao tham số endptr để strtof và strtod một con trỏ đến một con trỏ char không const?
float strtof(const char *str, char **endptr);
double strtod(const char *str, char **endptr);
Họ từng phân hủy chuỗi đầu vào, str
, thành ba phần:
- Một ban đầu, có thể có sản phẩm nào, chuỗi các khoảng trắng
- Một "chuỗi chủ đề" của các ký tự đại diện cho một giá trị dấu phẩy động
- Một "chuỗi cuối" của các ký tự không có giá trị được công nhận (và không ảnh hưởng đến chuyển đổi).
Nếu endptr
không phải là NULL
, sau đó *endptr
được đặt thành một con trỏ đến các nhân vật ngay sau khi ký tự cuối cùng đó là một phần của việc chuyển đổi (nói cách khác, sự bắt đầu của chuỗi dấu).
tôi tự hỏi: tại sao là endptr
, sau đó, một con trỏ đến một phi const
char
con trỏ? Không phải là *endptr
một con trỏ vào một số const
char
chuỗi (chuỗi đầu vào str
)?
Về cơ bản cũng giống như 'strchr' và bạn bè, ngoại trừ ở đây chúng ta có con trỏ out-param thay vì giá trị trả về. –
@Steve: vâng, nhưng nó có vấn đề hơn 'strchr' bởi vì bạn không thể chuyển địa chỉ của con trỏ' const' đủ điều kiện cho các hàm này mà không có một diễn viên rõ ràng. –
Câu hỏi thú vị. Về cơ bản, điều này có nghĩa là bạn có thể ẩn một diễn viên từ 'char const *' thành 'char *' đằng sau các hàm 'strtoX'. Kỳ dị. –