Різниця між <string.h> та <strings.h>


90

Я помітив, що існує (принаймні в 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 СТОП ДОПОМОГАЙ ЛЕД

Відповіді:


114

strings.h походить від гілки BSD в еволюції unix. Його вміст стандартизовано 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 СТОП ДОПОМОГАЙ ЛЕД

4
@R .: вони корисні, якщо у вас є застарілий код BSD для компіляції, який використовує ці функції. ;-)
Paul R
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.