C和指针(六)字符串、字符、字节

字符串
1,C没有显式的字符串类型,以字符串常量形式出现,存储于字符数组中。

2,C字符串是一串以NUL字节结尾的字符。
1)字符内部不能出现NUL字节。
2)NUL字节是字符串的终止符,不是字符串的一部分,所以字符串长度不包括NUL字节。

3,头文件string.h包含了使用字符串函数所需的原型和声明。
4,标准库函数有些是用汇编语言实现的,目的是充分利用机器提供的特殊字符串操作指令,可最大限度的追求速度。

字符串函数

1,字符串长度strlen返回无符号整型。
1)两字符串比较长度应直接比较大小,因为两无符号整型数相减结果永远大于等于0。
2)比较大小表达式中同时包含有符号和无符号,应将无符号强制转换为有符号再计算。

2,不受限制的字符串函数,通过寻找字符串参数结尾NUL字节判断长度,函数指定一块内存存放结果字符串,在使用这些函数时,应保证结果字符串不会溢出。
1)复制字符串strcpy,将源地址字符串复制到目的地址,如果源地址与目的地址有重叠,结果未字义,目的地址必须是字符数组或动态内存分配的指针,不能使用字符串常量。目的地址原参数内容丢失,以源字符串及NUL字节结尾。使用时应保证目标字符数组空间足以容纳需要复制的字符串,如果字符串比数组长,多余的字符会覆盖数组后面内存空间的值,strcpy无法判断目标字符数组的长度,所以使用时就小心。
2)连接字符串strcat,将源字符串连接到目的字符串后面,如果源地址与目的地址有重叠,结果未定义,须保证字符数组足以容纳源字符串。
3)strcpy和strcat返回指向目标字符数组的指针。
4)字符串比较strcmp,两字符串对应字符逐个比较,直到发现不匹配为止,比较字符的字典序,前一字符串不匹配字符小于后一字符串字符则返回小于零的值,相等返回0,大于返回大于零的值。

3,长度受限的字符串函数,接受显式长度参数,用于限定复制或比较的字符数,防止目标数组溢出。
1)strncpy, strncat, strncmp,复制、连接、比较指定数量字符,与不受限制版本一样,如果源参数和目标参数发生重叠,结果未定义。
2)strncpy将源字符串中指定长度字符复制到目标数组,如果源字符串长度小于指定长度,目标数组使用NUL字符填充,如果长度大于或等于指定长度,指定长度字符复制到目标数组,结果可能不以NUL字节结尾,不是字符串。
3)当使用strncpy函数创建字符串,应确保字符串以NUL字节结尾,否则使用库函数或在printf中使用%s格式码打印时无法检测到结束字节。
4)strncat会在结果字符串后添加NUL字符,最多在目标字符串后连接指定长度+1个字节。5)strncmp最多比较指定长度字符。

4,当调用函数请求操作系统执行例如打开文件等功能出现错误时,操作系统通过设置外部整型变量errno报告错误代码,strerror函数根据错误代码返回指向错误描述字符串的指针。

5,总结
1)strlen函数计算字符串的长度,返回值是一个无符号整数。
2)strcpy函数把一个字符串从一个位置复制到另一个位置。
3)strcat函数把一个字符串的拷贝添加到另一字符串的后面。
4)strcpy和strcat函数都假定它们的参数是有效的字符串,如果源字符串和目标字符串出现重叠,函数的结果未定义。
5)strcmp对两个字符串进行词典序比较,返回值提示第一个字符串是大于、小于还是等于第二个字符串。
6)长度受限的函数strncpy、strncat、strncmp类似对应的不受限制版本,区别在于这些函数接受一个长度参数。
7)strncpy中长度指定了多少个字符将写入到目标字符数组中,如果源字符串比指定长度更长,结果字符串将不会以NUL字节结尾。
8)strncat函数的长度参数指定从源字符串复制过来的字符最大数目,但它的结果始终是以一个NUL字节结尾。
9)strncmp函数长度参数用于限定字符比较的数目,如果两个字符串在指定的数目里不存在区别,便认定是相等的。

查找函数

1,字符查找
1)strchr在字符串中查找某个特定字符第一次出现的位置,返回指向该位置指针,未找到返回NULL指针。
2)strrchr在字符串中查找某个特定字符最后一次出现的位置,返回指向该位置指针,未找到返回NULL指针。
3)strpbrk在字符串中查找另一字符串中任意字符第一次出现的位置,返回指向匹配字符位置指针,未找到返回NULL指针。

2,子串查找
1)strstr在字符串中查找子串第一次出现的位置,返回指向匹配子串的起始位置,未找到返回NULL指针。
2)标准库不存在strrpbrk和strrstr函数。

3,字符串前缀查找。
1)strspn字符串与另一字符串中任意字符匹配的字符数,当出现不匹配字符时停止查找。
2)strcspn字符串不与另一字符串任意字符匹配的字符数,当出现匹配字符时停止查找。

4,标记查找,用于提取分隔符隔开的字符串。
1)strtok第一个参数指定一个字符串,第二个字符串参数是分隔符的集合,在字符串中找到分隔符集合中的下一个标记,将其用NULL结尾,返回指向标记的指针。
2)strtok第一个参数为NULL时,函数在同一个字符串中从被返回的位置像前一次一样查找下一个标记,如果字符串中不存在分隔符,返回NULL指针。
3)典型情况下,第一次调用strtok传递一个指向字符串的指针,之后函数重复调用,第一个参数为NULL,直到返回NULL为止。

字符操作
1,标准库包含两组函数操作单独的字符,原型位于头文件ctype.h中,第一组用于对字符分类,第二组用于转换字符。

2,分类函数接受一个字符值的整型参数,返回整型值,表真或假。
1)iscntrl控制字符
2)isspace空白字符:空格,换页\f,换行\n,回车\r,制表符\t,垂直制表符\v
3)isdigit十进制数字0~9
4)isxdigit十六进制数字,0~9,a~f,A~F
5)islower 小写字母a~z
6)isupper大写字母A~Z
7)isalpha字母a~z、A~Z
8)isalnum数字0~9,字母a~z、A~Z
9)ispunct标点符号,任何不属于数字和字母的图形字符(可打印符号)
10)isgraph任何图形字符
11)isprint任何可打印字符,包括图形字符和空白字符

3,转换函数tolower,toupper将大写字母转换为小写或将小写字母转换为大写,其他不变。

内存操作

1,字符串由NUL字节结尾,内部不能包含NUL字符,非字符串数据内部包含零值时不能使用字符串函数,可使用另一组相关函数,操作与字符串函数类似,可以处理任意的字符序列。
1)内存操作函数与strn前缀的函数不同,遇到NUL字节时不会停止操作。
2)字符串是零个或多个字符的序列,以NUL字节结尾。

2,memcpy从源地址复制n个字节到目标地址,可以复制任何类型的值,字符、整型等。
1)参数类型是void*型指针,任何类型的指针都可以转换为void*型指针。
2)对于长度大于一个字节的数据,在第三个参数里数量和数据类型长度相乘,可以使用这种方式复制结构或结构数组。
3)目标参数与源参数重叠结果未定义。

3,memmove与memcpy类似,但源地址和目标地址可以重叠,将源操作数据复制到临时位置,临时位置不会与源地址和目标地址重叠,再从临时位置复制到目标地址。
1)memmove通常无法使用某些机器提供的特殊字节或字符串处理指令。
2)可能比memcpy慢,但如果源地址与目标地址可能存在重叠时应该使用memmove。

4,memcmp对两段内存内容比较n个字节,按照无符号字符逐字节比较,如果比较的不是单字节数据如整型或浮点数时可能出现不可预料结果。
5,memchr查找字符在字符串中第一次出现的位置,返回指向该位置的指针,共查找n个字节,如果n个字节中未找到该字符,返回NULL指针。
6,memset将目标地址前n个字节设置为字符值,可用于字符数组初始化。

猜你喜欢

转载自blog.csdn.net/mei_true/article/details/131263414