C /C++标准库 - (string.h)

1. string.h 概述

string.h支持C语言把文本作为字符数组操作的传统,其声明了一种类型和几个函数,并定义了一个宏。

声明的类型是size_t,定义的宏是NULL。

确定数组长度的方法有很多种,但是所有情况下,char* 或者 void* 参数都指向数组的第一个(最低地址字符)。

2. Functions(函数)

2.1 Copying(复制):

序号 标记 原型 说明
1 memcpy void * memcpy ( void * destination, const void * source, size_t num ); 复制n个字符串,若复制发生在两个重叠区域,则行为未定义
2 memmove void * memmove ( void * destination, const void * source, size_t num ); 将N个字节的源内存地址的内容拷贝到目标内存地址中
3 strcpy char * strcpy ( char * destination, const char * source ); 复制字符串(包括终止符),如果复制对象重叠,则未定义
4 strncpy char * strncpy ( char * destination, const char * source, size_t num ); 复制最多的n个字符(不复制空字符后边的字符),复制对象重叠,未定义,如果source字符比n少,则destination后边添加空字符

2.2 Concatenation(连接):

序号 标记 原型 说明
1 strcat char * strcat ( char * destination, const char * source ); 把source指向的串(包括终止符)的副本添加到destination的末尾,并覆盖destination的终止符。若重叠,出错。
2 strncat char * strncat ( char * destination, const char * source, size_t num ); 最多添加n个字符(空字符后边不添加),通常最后添加结束符

2.3 Comparison(比较)

比较函数memcmp、strcmp和strncmp返回非零值的符号由参与比较的对象中的第一对不相等的如肝字符(解释为uchar类型)的差值符号决定。
str1<、=或 >str2(转为uchar) 返回< 、=或 > 0的整数

序号 标记 原型 说明
1 memcmp int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 逐字符比较,不同于strcmp,遇到结束符继续比较
2 strcmp int strcmp ( const char * str1, const char * str2 ); 逐字符比较,不同于memcmp,遇到结束符停止比较
3 strncmp int strncmp ( const char * str1, const char * str2, size_t num ); 逐字符比较,最大比较n各字符,遇到结束符停止比较
4 strcoll int strcoll ( const char * str1, const char * str2 ); Compare two strings using locale
5 strxfrm size_t strxfrm ( char * destination, const char * source, size_t num ); Transform string using locale

获得字符串s的长度:1+strxfrm( NULL, s, 0)

2.4 Searching(查找):

序号 标记 原型 说明 返回值
1 memchr void * memchr (void * ptr, int value, size_t num ); 定位字符c第一次出现的位置(前n个字符中找) 成功,返回定位的指针,否则返回NULL
2 strchr char * strchr (char * str, int character ); 定位字符c第一次出现的位置(包括结束符) 同上
3 strcspn size_t strcspn ( const char * str1, const char * str2 ); 计算str1中与str2中完全不重复字符串的初始最大长度 返回长度
4 strpbrk char * strpbrk ( const char , const char ); 确定s2指向的串中的任意字符在s1指向的串中第一次出现的位置 找到,返回指针,否则返回NULL
5 strrchr char * strrchr ( const char *, int ); 定位字符c最后一次出现的位置(包括结束符) 同上
6 strspn size_t strspn ( const char * str1, const char * str2 ); Returns the length of the initial portion of str1 which consists only of characters that are part of str2 不包括终止符,且结束于终止符,返回串的长度
7 strstr char * strstr ( const char , const char ); Locate substring(s2在s1中第一次出现的位置)(不包括终止符) 返回定位字符串
8 strtok char * strtok ( char * str, const char * delimiters ); 分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL 每次调用成功则返回指向被分割出片段的指针

2.5 other:

序号 标记 原型 说明 返回值
1 memset void * memset ( void * ptr, int value, size_t num ); 把c的值复制到s指向对象的前n个字符中 返回s的值
2 strerror char * strerror ( int errnum ); Get pointer to error message string 返回错误信息字符串
3 strlen size_t strlen ( const char * str ); Get string length 返回终止字符串前边的字符数目(不包括’\0’)

3. 补充说明

3.1 memcpy与memmove的区别

  • 相同点:memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。
  • 不同点:但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。

memmove的处理措施:

(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝

(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝

(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

3.2 strlen和sizeof的区别

  • sizeof
    sizeof(…)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
    具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
    数组——编译时分配的数组空间大小;
    指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
    类型——该类型所占的空间大小;
    对象——对象的实际占用空间大小;
    函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
  • strlen
    strlen(…)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
    它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。

总之:

  • sizeof只关注编译器为字符串为其分配的数组空间大小,不关心里面存了多少数据
  • strlen只关心存储的数据内容,不关心空间的大小和类型

参考1:http://blog.csdn.net/21aspnet/article/details/1539951
参考2:http://www.cplusplus.com/reference/cstring/
参考3:《C标准库》,P.J. Plauger 著
参考4:《C语言参考手册》,Samuel P. Harbison III 等著

你可能感兴趣的:(C++)