2014-06-28 20 views
10

Là chức năng thư viện C khác, như strcpy, strcat, có một phiên bản giới hạn kích thước của chuỗi (strncpy, v.v.), tôi tự hỏi tại sao không có biến thể như vậy cho strchr?Tại sao không có chức năng strnchr?

+3

Tại sao bạn sẽ cần đến nó? 'Memchr()' không làm điều đó 'strnchr()' sẽ làm gì? –

+2

@JonathanLeffler Có lẽ 'strnchr()' sẽ dừng lại khi một trong hai đầu cuối bị trúng * hoặc * chiều dài tối đa bị trúng. 'strchr_s' có thể là một tên tốt hơn. Nhưng tất nhiên nếu bạn có chuỗi bị tràn trong tập dữ liệu của mình, bạn đã mất. – Sneftel

+1

@Sneftel: Hmmm… thú vị… Nếu bạn không biết chuỗi null bị chấm dứt bao lâu nhưng biết rằng nó không dài hơn N byte và bạn chỉ quan tâm tìm kiếm M byte đầu tiên nhiều nhất và M

Trả lời

15

Nó không tồn tại - nó được gọi là memchr:

http://en.wikipedia.org/wiki/C_string_handling

+1

Lưu ý rằng 'memchr' không phải là * exacly * những gì người ta có thể mong đợi' strnchr' có thể làm, vì 'memchr' không dừng ở cuối chuỗi nếu nó ngắn hơn đối số' n' (nghĩa là nó có thể đọc byte ngoài '\ 0', không giống' strchr'). Tương đương "n-less" của 'memchr' không phải là' strchr', nhưng 'rawmemchr', một phần mở rộng của GNU không phải là POSIX hay C99. – anol

+1

Vì vậy, '#define strnchr (haystack, kim, chiều dài) memchr (haystack, kim, strnlen (haystack, length))' nên làm điều đó, phải không? –

7

Trong C, thuật ngữ "chuỗi" thường có nghĩa là "vô hiệu hóa mảng ký tự" và các hàm str* hoạt động trên các loại chuỗi đó. Các n trong các chức năng bạn đề cập chủ yếu là vì mục đích kiểm soát đầu ra .

Nếu bạn muốn hoạt động trên một lệnh byte không có bất kỳ ngữ nghĩa chấm dứt ngụ ý nào, hãy sử dụng họ mem* các hàm; trong trường hợp của bạn memchr sẽ phục vụ nhu cầu của bạn.

+0

Thông tin chi tiết tốt, nhưng các ví dụ về chức năng hiện có trong đó một ràng buộc được cung cấp cho một chuỗi đầu vào là 'strncmp()' và 'printf ("%. * S ", n, s);'. Lưu ý rằng một manpage thích hợp cho 'strncmp' sẽ tránh nói rằng nó lấy các chuỗi như là đối số, nhưng BSD và GNU manpages có chút cẩu thả về vấn đề này. Các tiêu chuẩn C mặt khác là hoàn toàn worded. –

+0

Cũng là 'strnlen() 'của POSIX. –

+0

@PascalCuoq: Thú vị. Tôi có lẽ sẽ nhìn hai lần tại bất kỳ thuật toán mà cáo buộc là một trường hợp sử dụng tốt cho 'strnlen'. –

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