C语言头文件string.h

C/C++ 2014年10月21日 ,

C标准库头文件string.h中定义了一些类型、宏和函数,下面对<string .h>的总结。

1 类型

<string.h>定义了1种类型。

1.1 size_t

size_t足够表达字符数组的大小。

无符号类型,一般定义为unsigned int或者unsigned long

2 宏

<string.h>定义了1个宏。

2.1 NULL

NULL表示空指针。兼容除函数指针之外的所有指针类型,也就是说可以用于初始化除函数指针之外的所有指针类型。

为兼容早期C语言,一般定义为00L(void *)0中的一种。

3 函数

<string.h>定义了22个函数。

根据函数处理的(这里没有指明是字符串)形式不同可分为三类:

  • mem开头的函数对任意的字符序列进行操作。其中一个参数(s)指串的起始地址。另一个参数(n)对元素个数进行计数。
  • strn开头的函数对非空的字符序列进行操作。参数s和n的含义同上条。操作在元素s[n]前结束,或者在首次s[i]为'\0'处结束。
  • str开头的函数对空字符'\0')结尾的串进行操作。

根据函数的功能不同,可分为五类:

  • 复制函数,如memcpy()、strcpy()等。
  • 连接函数,如strcat()等。
  • 比较函数,如memcmp()、strcmp()等。
  • 查找函数,如strstr()、memchr()等。
  • 其他函数,如strlen()等。

下面按照函数的功能不同分类,进行介绍。

3.1 复制函数

3.1.1 memcpy

void *memcpy(void *s1, const void *s2, size_t n);

函数memcpys2指向的对象中复制n个字符到s1指向的对象中。如果s1s2两个对象重叠,则这种行为未定义

函数返回指向s1的指针。

3.1.2 memmove

void *memmove(void *s1, const void *s2, size_t n);

函数memmoves2指向的对象中复制n个字符到s1指向的对象中。如果s1s2两个对象重叠,可以保证正确复制,但速度不会比memcpy快。

函数返回指向s1的指针。

3.1.3 strcpy

char *strcpy(char *s1, const char *s2);

函数strcpys2指向的串(包括结尾空字符)复制到s1指向的数组中。如果s1s2两个对象重叠,则这种行为未定义

函数返回指向s1的指针。

3.1.4 strncpy

char *strncpy(char *s1, const char *s2, size_t n);

函数strncpys2指向的串复制n个字符到s1指向的数组中。并不会自动在s1末尾添加空字符('\0')。如果s1s2两个对象重叠,则这种行为未定义

如果s2指向的数组长度比n短的串,则在s1后添加空字符,直到写入n个字符。

函数返回指向s1的指针。

3.2 连接函数

3.2.1 strcat

char *strcat(char *s1, const char *s2);

函数strcats2指向的串(包括结尾空字符)的副本添加到s1指向的中串的末尾,s2的第一个字符覆盖s1的末尾空字符。如果s1s2两个对象重叠,则这种行为未定义

函数返回指向s1的指针。

3.2.2 strncat

char *strncat(char *s1, const char *s2, size_t n);

函数strncats2指向的串最多n个字符(空字符及其后厕所字符不添加)添加到s1指向的中串的末尾,s2的第一个字符覆盖s1的末尾空字符。通常在连接结果后添加空字符。如果s1s2两个对象重叠,则这种行为未定义

函数返回指向s1的指针。

3.3 比较函数

3.3.1 memcmp

int memcmp(const void *s1, const void *s2, size_t n);

函数memcmps1指向的对象的前n个字符和s2指向的对象的前n个字符进行比较。

s1指向的对象大于、等于或者小于s2指向的对象时,函数memcmp分别返回一个大于、等于或者小于0的整数。结构体中为对齐而留的'空隙'是不确定的,对于小于指定长度的字符串和联合也是不确定的。

3.3.2 strcmp

int strcmp(const void *s1, const void *s2);

函数strcmps1指向的串和s2指向的串进行比较。

s1指向的串大于、等于或者小于s2指向的串时,函数strcmp分别返回一个大于、等于或者小于0的整数。

3.3.3 strcoll

int strcoll(const void *s1, const void *s2);

函数strcolls1指向的串和s2指向的串进行比较。比较时串被解释为适合当前区域设置的类别LC_COLLATE的形式。

两个串都被解释为适合当前区域设置的形式后,当s1指向的串大于、等于或者小于s2指向的串时,函数strcoll分别返回一个大于、等于或者小于0的整数。

3.3.4 strncmp

int strncmp(const char *s1, const char *s2);

函数strncmps1指向的数组中最多前n个字符(空字符后面的字符不参加比较)和s2指向的数组中最多前n个字符进行比较。

s1指向的串大于、等于或者小于s2指向的串时,函数strncmp分别返回一个大于、等于或者小于0的整数。

3.3.5 strxfrm

size_t strxfrm(char *s1, const char *s2, size_t n);

函数strxfrms2指向的C串转换为适合当前区域设置的串,并将前n(包括空字符)个转换后的字符复制到s2指向的串中。
n0时,s1可以是NULL

函数strxfrm返回转换后字符串(不包括结尾的空字符)的大小。如果返回值是n或者更大,则s1指向的数组的内容是不确定的。

3.4 查找函数

3.4.1 memchr

void *memchr(const void *s, int c, size_t n);

函数memchr查找c(转换为unsigned char类型)在s指向的对象的前n个字符(都转换为unsigned char类型)中第一次出现的位置。

函数memchr返回指向查找到的位置的指针,或者该字符没有出现在对象中则返回空指针。

3.4.2 strchr

char *strchr(const char *s, int c);

函数strchr查找c(转换为char类型)在s指向的串中第一次出现的位置,结尾的空字符被认为是串的一部分。

函数strchr返回指向查找到的位置的指针,或者该字符没有出现在对象中则返回空指针。

3.4.3 strcspn

size_t strcspn(const char *s1, const char *s2);

函数strcspn查找s1指向的串中首次出现s2指向的串中字符(包括空字符)的位置。

函数strcspn返回查找到的位置索引(0开始)。

3.4.4 strpbrk

char *strpbrk(const char *s1, const char *s2);

函数strpbrk查找s1指向的串中首次出现s2指向的串中字符(不包括空字符)的位置。

函数strpbrk返回指向查找到的位置的指针,或者该字符没有出现在对象中则返回空指针。

3.4.5 strrchr

char *strrchr(const char *s, int c);

函数strrchr查找c(转换为char类型)在s指向的串中最后一次出现的位置,结尾的空字符被认为是串的一部分。

函数strrchr返回指向查找到的位置的指针,或者该字符没有出现在对象中则返回空指针。

3.4.6 strspn

size_t strspn(const char *s1, const char *s2);

函数strspn查找s1指向的串中首次没有出现s2指向的串中字符(包括空字符)的位置。

函数strspn返回查找到的位置索引(0开始)。

3.4.7 strstr

char *strstr(const char *s1, const char *s2);

函数strstr查找s1指向的串中首次出现s2指向的串(不包括空字符)的位置。

函数strstr返回指向查找到的位置的指针,或者如果没有找到则返回空指针,或者如果s2指向一个长度为零的串则返回s1

3.4.8 strtok

char *strtok(char *s1, const char *s2);

函数strtok的连续查找把s1指向的串分解为一系列记号,每个记号都由s2指向的串的字符界定。对这个序列的第一次调用把s1作为它的第一个参数,后面的调用把空指针作为它们的第一个参数,s2指向的串可能在每次调用时都不同。

对这个序列的第一次调用是从s1指向的串中搜索第一个在s2指向的当前分隔串中没有包含的字符。如果没有找到这样的字符,那么s1指向的串中就没有任何记号,函数strtok返回一个空指针。如果找到了这样的字符,它就是第一个记号的首字符。

然后函数strtok就从上面找到的字符开始搜索当前分隔串中包含的字符。如果没有找到这样的字符,当前的记号就延伸到s1指向的串的末尾,后面对一个记号的搜索就会返回一个宛指针。如果找到了这样的字符,它就会被一个空字符覆盖,这个空字符终止当前的记号,函数strtok保存指向下一个字符的指针,下一次对某个记号的搜索就会从这里开始。

后面的每一次调用都会用一个空指针作为第一个参数的值,并从保存的指针处开始搜索,搜索行为和上文描述相同。

实现的行为不受调用函数strtok的影响。

函数strtok返回指向一个记号的第一个字符的指针,如果没有记号,则返回空指针。

3.5 其他函数

3.5.1 memset

void *memset(void *s, int c, size_t n);

函数memsetc(转换为unsigned char类型)的值复制到s指向的对象的前n个字符的每个字符中。

函数memset返回指向s的指针。

3.5.2 strerror

char *strerror(int errnum);

函数strerror通过错误标号errnum获得错误描述字符串。实现的行为不受调用函数strerror的影响。

函数strerror返回指向对应错误的串的指针,这个串的内容由实现定义,不能由程序修改。

3.5.3 strlen

size_t strlen(const char *s);

函数strlen计算s指向的串的长度。

函数strlen返回s指向的串的长度(不包含空字符)。

4 总结

头文件<string.h>中的函数是对字符串操作,或者对连续的内存进行操作。三类不同串操作函数的使用情况如下:

  • 如果一个串可以包含空字符,那么也必须指定它的长度,此时应该使用以mem开头的函数。
  • 如果一个串可能或者没有终止的空字符,那么也必须指定它的长度,此时适合使用以strn开头的函数。
  • 如果一个串一定以空字符结束,此时适合使用以str开头的函数。

更多请参考C标准库

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《C语言头文件string.h》
日志链接:http://furzoom.com/c-stdlib-string-h/
博客名称:枫竹梦

【上一篇】
【下一篇】

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部