五.字符串函数
1.strlen()函数
strlen()函数用于统计字符串的长度。
1 | /* test_fit.c -- try the string-shrinking function */ |
fit()
函数把第39个元素的逗号替换成'\0'
字符。puts()
函数在空字符处停止输出,并忽略其余字符。然而,这些字符还在缓冲区中,下面的函数调用把这些字符打印了出来:
1 | puts(mesg + 8); |
表达式mesg + 39
是mesg[39]
的地址,该地址上储存的是空格字符。所以put()
显示该字符并继续输出直至遇到原来字符串中的空字符.
演示过程如下图所示:
2.strcat()和strncat()函数
strcat()
(用于拼接字符串)函数接受两个字符串作为参数。该函数把第2个字符串的备份附加在第1个字符串末尾,并把拼接后形成的新字符串作为第1个字符串,第2个字符串不变。
strcat()
函数的类型是char *
(即,指向char的指针)。strcat()
函数返回第1个参数,即拼接第2个字符串后的第1个字符串的地址。
strcat()
的用法:
1 | /* str_cat.c -- joins two strings */ |
strcat()
函数问题:
解决方法:
- 用
strlen()
查看第1个数组的长度。注意,要给拼接后的字符串长度加1才够空间存放末尾的空字符。
- 用
strncat()
,该函数的第3 个参数指定了最大添加字符数。
strncat()
例子
1 | /* join_chk.c -- joins two strings, check size first */ |
strcat()和 gets()类似,也会导致缓冲区溢出。为什么 C11 标准不废弃strcat(),只留下strncat()?为何对gets()那么残忍?这也许是因为gets()造成的安全隐患来自于使用该程序的人,而strcat()暴露的问题是那些粗心的程序员造成的。无法控制用户会进行什么操作,但是,可以控制你的程序做什么。C语言相信程序员,因此程序员有责任确保strcat()的使用安全。