一.字符串操作函数:
头文件:include<string.h>
一般不要对字符串常量进行修改,如果要修改,最好把字符串存放在字符数组中
你不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符。
不受限制的字符串函数:
1.strcpy 函数:
char *strcpy( char *strDestination, const char *strSource);
将
strSource字符串复制到
strDestination
中,如果参数strSource和
strDestination在内存中出现重叠,其结果是未定义的
由于strDestination参数要进行修改,所以它必须是一个字符数组或者是一个指向动态分配内存的数组的指针,不能使用字符串常量。
将strSource拷贝到strDestination中,包括'\0'也被拷贝过去,导致的后果是完全就将目的字符串的内容覆盖掉。
必须保证目的字符数组的空间足以容纳需要复制的字符串,如果源字符串的长度大于目的字符数组,多余的字符仍被复制
,它们将覆盖
原先存储于数组后的内存空间的值。
返回值为一个指向目标字符数组的指针。
2.strcmp (字符串比较函数):
int strcmp( const char *string1, const char *string2 );
返回值有三种情况:
1.string1 > string2 (返回一个大于0的数)
2.string1 < string2(返回一个小于0的数)
3.string1 = string2(返回0)
3.strcat(连接字符串)函数原型为:
char *strcat( char *strDestination, const char *strSource);
将第二个字符串参数添加到第一个字符串参数的末尾,
如果参数strSource和
strDestination在内存中出现重叠,其结果是未定义的
注意:第一个参数不能是字符串常量,一般为一个字符数组,而且,需要确保字符数组有足够的空间,
函数并不对其大小进行检查
返回值为一个指向目标字符数组的指针。
长度受限的字符串函数:
1.char *strncpy( char *strDest, const char *strSource, size_tcount );
strncpy把源字符串的字符复制到目标数组,然而,它只是向目标数组写入count个字符,如果源字符串的长度小于count,
那么目标数组
就用'\0'填充到count长度。如果源字符串的长度大于或等于count,那么只有count个字符被复制到目标数组里了,
它的结果将不会以'\0'结尾。strncpy调用的结果可能不是一个字符串
2.char *strncat( char *strDest, const char *strSource, size_tcount );
strncat与strncpy的不同之处在于,strncat总是在结果字符串后面添加一个'\0',
3.int strncmp( const char *string1, const char *string2, size_tcount );
strncmp最多比较count个字符,如果在第count个字符之前就存在不相等的字符,那么这个函数就像strcmp一样
停止比较,如果两个字符串的前count个字符相等,函数就返回0.
4.strchr strrchr (在字符串内搜索一个字符) 函数原型为:
char *strchr( const char *string, intc );
char *strrchr( const char *string, intc );
strchr 在字符串中(第一个参数)查找一个字符(第二个参数)第一次出现的位置:
如果找到了就返回指向这个位置的指针,如果没有找到,则返回一个NULL指针
strrchr与strchr不同的是,它返回的是一个指向字符串中该字符最后一次出现的位置
5.strpbrk(查找任何几个字符)
char *strpbrk( const char *string, const char *strCharSet );
它并不是查找某个特定的字符,而是查找strCharSet中任何一个字符第一次在string中出现的位置,
如果未找到匹配,
则返回NULL
6.strstr (在字符串内查找一个子串)函数原型:
char *strstr( const char *string, const char *strCharSet);
在一个字符串中(第一个参数)查找另一个字符串 (第二个参数) 第一次出现的位置:如果找到了
就返回指向这个位置的指针,如果没有找到,则返回一个NULL指针
//高级字符串查找:
7.(查找标记)strtok函数原型:
char *strtok( char *strToken, const char *strDelimit);
一个字符串常常包含几个单独的部分,它们彼此被分隔开来,这个函数可以将它们(标记)从字符串中
抽取出来,
并丢弃分隔符。
strDelimit参数是个字符串,定义了用作分隔符的字符集合,strToken是一个字符串,内部包含了零个或多个由
strDelimit字符串中
的分隔符分隔的标记,strtok找到strDelimit的下一个标记,并将其用'\0'结尾,然后返回
一个指向这个标记的指针。
如果strtok函数的第一个参数不是NULL,函数将会找到字符串的第一个标记,strtok同时将保存它在字符串中的位置;
如果strtok函数的第一个参数是NULL,函数就在同一个字符串中从这个被保存的位置开始像前面一样查找下一个标记,
如果字符串中不存在更多的标记,函数就返回一个NULL 指针。
一般情况下:
strtok函数的用法:在第一次调用这个函数时,向它传递一个指向字符串的指针,然后,这个函数被重复
调用(这时的
第一个参数为NULL)直到它返回NULL为止。
注意:
由于strtok函数保存它所处理的函数的局部状态信息,所以不能用它同时解析两个字符串。
//end高级字符串查找
二.字符操作:
头文件:#include<ctype.h>
使用字符分类函数和字符转换函数可以提高函数的可移植性。
1.字符分类:
每个分类函数接受一个包含字符值的整型参数,函数测试这个字符并返回一个整型值,表示真或假
括号内是条件,返回值0表示假,非0即为真(不一定为1)
iscntrl(任何控制字符)
isspace(空白字符:' ', '\f'(换页), '\n' , '\r'(回车), '\t', '\v'(垂直制表符))
isdigit(十进制数字0~9)
isxdigit(十六进制数字,包括所有的十进制数字,小写字母a~f,大写字母A~F)
islower(小写字母a~z)
isupper(大写字母A~Z)
isalpha(字母a~z或A~Z)
isalnum(字母或数字,a~z,A~Z或者0~9)
ispunct(标点符号,任何不属于数字或字母的图形字符)
isgraph(任何的图形字符)
isprint(任何的可打印字符,包括图形字符和空白字符)
2.字符转换:
转换字符将大写字母转换为小写字母,或将小写字母转换为大写字母
tolower函数原型:
int tolower( int c );
int toupper( intc );
tolower 函数返回其参数的对应小写形式
toupper函数返回其参数的对应大写形式
如果tolower函数参数不是大写字母,函数将不修改参数直接返回
toupper函数同理
字符串是由'\0'结束的,所以字符串内部不能包含'\0',但是,非字符串数据内部存在0值,这时这些字符串操作函数就不能使用,
因为它们遇到第一个'\0'就停止了。这时可以使用另外的一些函数,即就是我们的内存操作函数,它们的操作于字符串函数类似,
但是这些函数可以处理任意的
字节序列(遇到'\0'不会停止)。
三.内存操作:
memcpy函数:
void *memcpy( void *dest, const void *src, size_tcount );
memcpy从src的起始位置复制length个字节到dest的内存起始位置,(这种方法可以复制任何类型的值)
第三个参数指定复制值的长度(内存空间,以字节计,数量乘以数据类型的长度)。
如果src和dest以任意形式出现了重叠,
其结果是未定义的(通俗的讲,就是src和dest指向了同一个数组时
)
前两个参数并不需要进行强制类型转换,因为void*可以容纳任意类型的指针
例如:
memcpy( saved_answers,answers, count*sizeof(answers[0]));
memmove函数:
void *memmove( void *dest, const void *src, size_tcount );
memmove函数的功能和memcpy差不多,只是它的源和目的操作数可以重叠(也就是它们可以指向同一个数组),
它是将源操作数复制到一个临时位置,
这个位置不会和源以及目的操作数的位置重叠,然后再从这个临时位置复制到
目的操作数的位置
memcmp函数:
int memcmp( const void *buf1, const void *buf2, size_tcount );
对两段内存的内容进行比较,共比较count个字节
函数的返回类型和strcmp函数一样。但是如果用于比较的不是单字节的数据如整数或浮点数就可能给出不可预料的结果。
memchr函数:
void *memchr( const void *buf, intc, size_t count );
在buf的起始位置开始查找c第一次出现的位置,共查找count个字节,并返回一个指向该位置的指针。
如果在这count个字节并未找到该字符,则返回NULL指针
memset函数:
void *memset( void *dest, intc, size_t count );
memset函数把从dest的起始位置开始的count个字节都设置为字符c.
例如:将buffer的前size个字节都设置为字符0
memset(buffer,0,size);