C语言常用字符串库函数总结
C语言常用字符串库函数总结
- 新人报道,总结一下C语言字符串库函数的使用,一方面是和大家分享,一方面也是为了加深记忆,主要参考《C和指针》一书,若有描述不当,望指教。
1、 字符串基础
- C语言不像其他编程语言有专门的字符串类型,C语言的字符串一般是存于字符数组或由字符指针表示,字符串是指一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾,因为NUL为非打印字符,所以选它为终止符,字符串的这个特性非常重要!!!而字符串的长度指的是NUL之前字符的长度,不包括NUL。
2、 字符串库函数
1)
字符串长度(stringlength)
函数原型1:
size_t strlen(char const *string)
;
返回值:返回字符串长度;
函数功能:获得字符串长度,不包括最后的“\0”.
函数原型2:
size_t strnlen(const char *s, size_t maxlen)
;;
返回值:返回实际字符串长度或maxlen;
函数功能:获得字符串长度,不包括最后的“\0”. 如果实际个数n <= maxlen,则返回n,否则返回第二个参数。
注意点
:两个函数返回值size_t类型为无符号数,这个特点可能会导致出错,例如strlen(pStr)=10,则下面的判断语句strlen(pStr)-20>=0则永远为真,若想消除问题则需要将返回值强制转换为int。
2)拷贝字符串(stringcopy)
函数原型1:
char *strcpy(char *dst, char const *src)
;
返回值:返回dst拷贝;
函数功能:把参数src字符串拷贝到dst参数中,如果两者内存出现重叠,则结果未定义。.
注意点
:dst参数必须指向一个已分配内存的数组;拷贝src字符串时会将末尾的终止符NUL也拷贝,这样就会导致两个情况,举个例子说明:
char [] message = “different”;
strcpy(message, “shell”)
‘s’ ‘h’ ‘e’ ‘l’ ‘l’ 0 ‘e’ ‘n’ ‘t’ 0
strcpy(message, “programmer”);
‘p’ ‘r’ ‘o’ ‘g’ ‘r’ ‘a’ ‘m’ ‘m’ ‘e’ ‘r’ 0
有上面的例子可知,当src的长度小于等于dst时,拷贝时正常的,但dst数组内多余的字符被NUL隔开,相当于失去了引用,丢弃了;当src的长度大于dst的长度时,则会覆盖dst数组后面的内存空间,造成内存数据篡改,隐患很大,这主要是由于strcpy函数无法判断多少条数组长度的原因,因此在使用strcpy函数前一定要确认dst长度不小于src长度。
函数原型2:
char *strncpy(char *dst, char const *src, size_t len)
;
返回值:返回dst拷贝;
函数功能:拷贝src指定长度字符到dst目标数组,总是拷贝len个字符。
注意点
:当src的的字符长度小于len时,会填充额外的NUL;当src的字符长度大于len时,就会拷贝len个字符到dst中,注意!结尾不会有NUL字符,这样有可能导致dst字符数组指向一个不定长的字符串,这样如果访问超出dst数组外的内存数据就会导致崩溃。
如调用strncpy(message, “programmer”, 10);,message就会变成无NUL结尾的数据:
‘p’ ‘r’ ‘o’ ‘g’ ‘r’ ‘a’ ‘m’ ‘m’ ‘e’ ‘r’ …
所以在使用时一定要确认拷贝后的dst数组最后为NUL。
3) 连接字符串(stringcantenate)
函数原型1:
char *strcat(char *dst, char const *src)
;
返回值:返回dst拷贝;
函数功能:把src字符串连接到dst字符串后面;
注意点
:使用前一定要确认dst数组能同时容纳dst原始字符串和src字符串,否则会内存越界覆盖。
函数原型2:
char *strncat(char *dst, char const *src, size_t len)
;
返回值:返回dst拷贝;
函数功能:把src字符串前n个字符连接到dst字符串后面;
注意点
:如果src字符串的长度大于len,则会拷贝len个字符连接在dst后面并且会在最后添加一个终止符NUL;如果src字符串的长度小于len,则会拷贝src所有字符并在最后添加一个终止符NUL。另外一点注意点和strcat一样注意越界覆盖问题。
4)字符串比较(stringcompare)
函数原型1:
int strcmp(char const *s1, char const *s2)
;
返回值:如果s1大于s2则返回一个大于0的值;如果s1小于s2则返回一个小于0的值;如果字符串相等则返回0。
函数功能:基于词典比较s1和s2大小。
注意点
:s1和s2必须是字符串,即以NUL结尾;大于或小于时的返回值没指定为1和-1,所以判断结果是要注意。
函数原型2:
int strncmp(char const *s1, char const *s2, size_t len)
;
返回值:如果s1大于s2则返回一个大于0的值;如果s1小于s2则返回一个小于0的值;如果字符串相等则返回0。
函数功能:基于词典比较s1和s2最多前len个字符大小。
注意点
:同strcmp;如果两个字符串在第len个字节之前存在不相等字符就会和strcmp一样停止比较返回结果,若果到第n个字符都相等,则返回0。
5)字符串查找(string char research(rear))
函数原型1:
char *strchr(char const *str, int ch)
;
返回值:如果在str字符串中(从左到右)查找到字符ch,则返回ch第一次出现所在位置指针;若没有则返回NULL。
函数功能:在str中正向查找字符ch第一次出现的位置。
函数原型2:
char *strrchr(char const *str, int ch)
;
返回值:如果在str字符串中(从右到左)查找到字符ch,则返回ch第一次出现所在位置指针;若没有则返回NULL。
函数功能:在str中反向查找字符ch第一次出现的位置。
注意点
:需要对函数返回值作非空判断。