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(复制):
序号 | 标记 | 原型 | 说明 |
---|---|---|---|
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 |
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的区别
sizeofsizeof(…)是运算符,在头文件中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 等著
相关文章推荐
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- C语言学习笔记----伊能C语言学习笔记----指针与地址的区别是什么?
- C++中extern “C”含义深层探索
- 尾插法创建带头结点单链表(c语言版)
- 【翻译】std::list::remove - C++ Reference
- c++函数指针
- c或c++中int转float中在printf中的问题
- hdoj1002(A+B problem II 大数相加 c语言
- 实战c++中的vector系列--使用vector构造二维数组
- 实战c++中的vector系列--使用vector构造二维数组
- udp组播试验-C语言
- 十一、c语言算术优先级和口诀
- C语言 文件
- c语言指针-简要
- 蓝桥杯 算法训练 出现次数最多的整数
- C++ STL 的实现:
- C++11: function type
- C++11 新的计时方法——std::chrono 大法好
- 【C++基础03】C++对C的加强
- C++STL库list容器简单实现