目录
本章重点介绍处理字符和字符串的库函数的使用和注意事项
求字符串长度
strlen
完整形态
size_t strlen ( const char * str );
作用
用来计算字符串'\0'之前的字符个数
注意事项
1.strlen的返回类型是size_t(无符号整型),直接使用该类型的数据进行计算时可能会出现错误
2.确保str字符串里有'\0'
3.strlen形参*前有const,源字符串str不会改变
长度不受限制的字符串函数
strcpy
完整形态
char* strcpy(char * destination, const char * source );
作用
将source的字符串拷贝到destination里('\0'也会拷贝过去)
注意事项
1.确保source里有'\0'
2.destination的空间必须足够大(起码可以容纳拷贝的内容)
3.destination的空间必须可变
4.source形参*前有const,源字符串不会改变
strcat
完整形态
char * strcat ( char * destination, const char * source );
作用
将source的字符串追加到destination字符串末尾并添加'\0'
注意事项
1.destination的空间必须足够大(起码可以容纳追加后的字符串的内容)
2.destination的空间必须可变
3.destination与source的字符串内必须有’\0‘
4.source形参*前有const,源字符串不会改变
5.不可以字符串自己给自己追加
strcmp
完整形态
int strcmp ( const char * str1, const char * str2 );
作用
比较两个字符串的大小(比较的原理是比较字符的ASCII码值的大小)
例:比较abd与abcdqwertyuijhgfdsdfghjk...(超级长)
先比较双方第一个字符a的大小,相等,再比较双方字符第二个字符b的大小,想等,再比较双方第三个字符c和d的大小,很好,d的ASCII码值大于c的ASCII码值,so,abd更大
str1>str2返回大于0的数字
str1=str2返回0
str1<str2返回小于0的数字
注意事项
1.str1和str2字符串结尾处都必须有'\0'作为结束标志
2.str1和str2前都有const修饰,源字符串不会改变
3.不同编译环境返回值有所不同,但是正负必定相同
长度受限制的字符串函数介绍
strncpy
完整形态
char * strncpy ( char * destination, const char * source, size_t num );
作用
拷贝num个字符从source到destination(如果source字符串的长度小于num,则拷贝完source字符串之后,在目标的后边追加0,直到num个)
注意事项
1.注意destination的空间大小,如果不足以容纳追加的source字符串,则会发生截断
2.在追加后不会补'\0',如有需要则需手动补充
3.source形参*前有const,源字符串不会改变
4.destination的空间必须可变
strncat
完整形态
char * strncat ( char * destination, const char * source, size_t num );
作用
用于将source字符串的前 n 个字符连接到destination字符串的末尾
注意事项
1.destination的空间必须足够大(剩余空间至少为n+1,起码可以容纳source字符串和'\0')
2.destination的空间必须可变
3.返回值为拼接后字符串destination的地址
4.source形参*前有const,源字符串不会改变
strncmp
完整形态
int strncmp ( const char * str1, const char * str2, size_t num );
作用
用于比较字符串str1和字符串str2的前 n 个字符是否相等(比较规则同strcmp函数,不过增加了比较的字符串长度限制)
注意事项
1.比较的是两个字符串的前 n 个字符,当 n
大于等于两个字符串的长度时,比较将涵盖整个字符串。如果 n
小于两个字符串的长度,则只比较两个字符串的前 n 个字符。
2.str1和str2前都有const修饰,源字符串不会改变
3.不同编译环境返回值有所不同,但是正负必定相同
字符串查找
strstr
完整形态
char * strstr ( const char *str1, const char * str2);
作用
str1
是要搜索的目标字符串,str2 是要查找的子字符串。strstr
函数会在目标字符串中查找子字符串的第一次出现,并返回一个指向该位置的指针。如果子字符串没有在目标字符串中找到,返回值为 NULL
注意事项
1.strstr
函数区分大小写,如果要进行大小写不敏感的搜索,可以使用其他方法
2.str1和str2前都有const修饰,源字符串不会改变
strtok
完整形态
char * strtok ( char * str, const char * sep );
作用
将字符串拆分成多个子字符串
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记
如果字符串中不存在更多的标记,则返回 NULL 指针
注意事项
1.在每次调用 strtok
后,函数会修改原始字符串,将分隔符替换为字符串结束符 \0
2.strtok使用时注意参数,一般会多次调用,后面调用的时候需传NULL
错误信息报告
strerror
完整形态
char * strerror ( int errnum );
作用
将错误码转换为相应的错误消息字符串
注意事项
1.strerror
函数根据当前系统的语言环境返回错误消息,所以可能会因系统而异
内存操作函数
memcpy
完整形态
void * memcpy ( void * destination, const void * source, size_t num );
作用
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置
注意事项
1.函数复制时是按照字节逐一复制的
2.内存重叠的时候,使用本函数会发生一些意想不到的效果
3.返回值是目标空间的起始地址
4.这个函数在遇到 '\0' 的时候并不会停下来
memcmp
完整形态
void * memmove ( void * destination, const void * source, size_t num );
作用
效果同上(如果源空间和目标空间出现重叠,就得使用memmove函数处理)
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
注意事项
1.memove可以说是优化版的memcpy
memset
完整形态
int memcmp ( const void * ptr1,const void * ptr2,size_t num );
作用
比较从ptr1和ptr2指针开始的num个字节
注意事项
1.按照字节进行比较
2.确保字节数正确
3.比较规则参考strcmp
4.memcmp
函数对空指针是安全的,即可以传入空指针作为参数。当其中一个指针为空时,返回的结果可能是不确定的
结尾
感谢认真观看完全文,如有发现错误,请指出,作者校正后会加以改正
这篇文章不是很满意(上一篇还是挺满意的),本来打算做的模拟实现和代码举例都没有做,后面内存函数也是草草了事,这篇文章就当简单了解一下这些函数吧
最后,祝各位道友早日突破/进阶