您的位置:首页 > 编程语言 > C语言/C++

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

2015-12-16 21:54 531 查看

1. string.h 概述

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

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

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

2. Functions(函数)

2.1 Copying(复制):

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

2.2 Concatenation(连接):

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

2.3 Comparison(比较)

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

str1<、=或 >str2(转为uchar) 返回< 、=或 > 0的整数

序号标记原型说明
1memcmpint memcmp ( const void * ptr1, const void * ptr2, size_t num );逐字符比较,不同于strcmp,遇到结束符继续比较
2strcmpint strcmp ( const char * str1, const char * str2 );逐字符比较,不同于memcmp,遇到结束符停止比较
3strncmpint strncmp ( const char * str1, const char * str2, size_t num );逐字符比较,最大比较n各字符,遇到结束符停止比较
4strcollint strcoll ( const char * str1, const char * str2 );Compare two strings using locale
5strxfrmsize_t strxfrm ( char * destination, const char * source, size_t num );Transform string using locale
获得字符串s的长度:1+strxfrm( NULL, s, 0)

2.4 Searching(查找):

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

2.5 other:

序号标记原型说明返回值
1memsetvoid * memset ( void * ptr, int value, size_t num );把c的值复制到s指向对象的前n个字符中返回s的值
2strerrorchar * strerror ( int errnum );Get pointer to error message string返回错误信息字符串
3strlensize_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:/article/2647362.html

参考2:http://www.cplusplus.com/reference/cstring/

参考3:《C标准库》,P.J. Plauger 著

参考4:《C语言参考手册》,Samuel P. Harbison III 等著
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: