C语言常用字符串库函数总结

  • Post author:
  • Post category:其他


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第一次出现的位置。


注意点

:需要对函数返回值作非空判断。



版权声明:本文为weixin_44098461原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。