ความแตกต่างระหว่าง <string.h> และ <strings.h>


91

ฉันสังเกตว่ามี (อย่างน้อยใน Mac OS X) ทั้ง<string.h>ส่วนหัวและ<strings.h>ส่วนหัว man 3 stringแสดงให้เห็นว่ามีฟังก์ชันที่แตกต่างกัน มีเหตุผลอะไรไหม?


2
สำหรับสิ่งที่คุ้มค่า OS X strings.hมีฟังก์ชั่นที่ไม่เป็นมาตรฐานbcmp bcopy bzero ffs index rindex strcasecmp strncasecmp... และนั่นแหล่ะ
Potatoswatter

3
@ Potatoswatter: กำลังทำตามที่ POSIX ระบุ
R .. GitHub STOP HELPING ICE

คำตอบ:


114

strings.h มาจากสาขา BSD ในวิวัฒนาการของยูนิกซ์ เนื้อหาได้รับการกำหนดมาตรฐานโดย POSIX แต่ส่วนใหญ่ถูกทำเครื่องหมายว่าเป็นแบบดั้งเดิมและสามารถแทนที่ด้วยฟังก์ชันอื่น ๆ ได้อย่างง่ายดาย:

int    bcmp(const void *, const void *, size_t); /* LEGACY, see memcmp */
void   bcopy(const void *, void *, size_t); /* LEGACY, see memcpy, memmove */
void   bzero(void *, size_t); /* LEGACY, see memset */
int    ffs(int);
char  *index(const char *, int); /* LEGACY, see strchr */
char  *rindex(const char *, int); /* LEGACY, see strrchr */
int    strcasecmp(const char *, const char *);
int    strncasecmp(const char *, const char *, size_t);

4
ไลบรารีมาตรฐาน C บางตัวได้รวมฟังก์ชันที่ไม่เลิกใช้แล้วstrings.hเข้าstring.hด้วยกัน ดูเช่นGlibc
entropo

19

โดยปกติ<strings.h>เพียงแค่เพิ่มฟังก์ชั่นที่มีประโยชน์บางสตริง <string.h>แต่ที่ไม่ได้มาตรฐานเพิ่มเติมให้กับส่วนหัวมาตรฐาน เพื่อความสะดวกในการพกพาสูงสุดคุณควรใช้<string.h>แต่ถ้าคุณต้องการฟังก์ชัน<strings.h>มากกว่าที่คุณต้องการการพกพาคุณสามารถใช้<strings.h>แทน<string.h>ได้


1
ฉันจะถามคำอธิบายของฟังก์ชันเหล่านี้ว่า "มีประโยชน์" ส่วนใหญ่เป็นฟังก์ชัน BSD ที่ซ้ำกันอย่างน่าเกลียดของฟังก์ชัน ANSI / ISO C มาตรฐานที่มีชื่อแตกต่างกัน ฟังก์ชันการเปรียบเทียบแบบไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่สำหรับสตริงไบต์คือ (ในแง่ความน่าเชื่อถือข้ามแพลตฟอร์ม) อาจไม่มีประโยชน์กับสตริง UTF-8 สมัยใหม่และแม้ว่าจะ "ทำงาน" แต่ก็อาจไม่ได้ให้ความหมายตามที่โปรแกรมเมอร์ต้องการ เพียง แต่ffsจะเป็นประโยชน์อาจจะเป็น
R .. GitHub STOP HELPING ICE

4
@R: มีประโยชน์หากคุณมีรหัส BSD เดิมในการคอมไพล์ที่ใช้ฟังก์ชันเหล่านี้ ;-)
Paul R
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.