《C Prime Plus》11.5学习笔记

342 阅读3分钟

字符串函数

这一章节介绍了诸多处理字符串的函数,其中大多数都被包含在头文件<string.h>中。

获取字符串的长度

前面的学习就接触到过,strlen()函数可以返回字符串参数的长度,但不包括字符串字面量结尾的没有显示出来的空字符\0

注意:strlen()函数返回值是unsigned int,在使用printf()时要用%ld

合并字符串

strcat()strncat()<string.h>中能够把两个字符串拼接的函数。

strcat()有两个字符串参数,如果拼接成功,返回的是第一个字符串的首字符地址,也就是说,strcat()是把第二个字符串参数接在第一个字符串参数的后面。要安全使用这个函数,首先要考虑到第一个字符串是非const字符串,也就是可修改;其次要计算好拼接内容是否会挤爆源字符串的内存空间,如果超过了,会发生内存溢出,比较危险,且计算长度时,要考虑到字符串结尾的空字符\0

strncat()strcat()多了一个最大添加字符数的参数,用来预防拼接内容过大的情况。

char a[11]='\0';
char b[10]='          ';
strncat(a,b,10);

比较字符串的异同

strcmp()strncmp()<string.h>中用来检查两个字符串从头开始哪里有不同的函数。

strcmp()接收两个字符串参数,从每个字符串第一个字符开始逐一检查,直到检查出两个同位置的字符是不同时,结束比较,返回第二个字符串这个位置与第一个字符串这个位置字符的整数差值。

char a[]="WDNMD";
char b[]="WDNNND";
int n = strcmp(a,b);
printf("%d",n);

n打印出来是-1,这是因为a和b前三位字符都是相同的,到了第四个字符出现不同,一个是M,一个是N,而N字符的整数值比M大1,所以得到M-N=-1,n被赋值-1。

strncmp()不同于前面的,这里多了一个n不是为了防止内存溢出,而是为了限定比较的字符数(可以理解为比较这一动作的迭代次数)

char a[]="WDNMD";
char b[]="WDNNND";
int n = strcnmp(a,b,3);
printf("%d",n);

运行后,n打印出来的是0,因为strncmp()被控制只比较前三个字符,前三个字符是一样的,自然就没有差值,strncmp()返回整数0(也可以理解为bool值),n就被赋值0了。

字符串拷贝

strcpy()strncpy()<string.h>中将一个字符串内容拷贝到另一个字符串的函数。

strcpy()接收两个字符串参数,作用是把第二个字符串的内容拷贝到第一个字符串中(会擦除第一个字符串原有的内容)。strcpy()的参数本质上还是地址,有意思的是,这些参数不需要是首字符地址,也可以是任意位置的地址,这样就可以实现部分拷贝了。(但要注意,必须用指针加整数的表示方法,不能用方括号的数组表示法)

但是,strcpy()跟前面学习的函数一样,并不会自己检查要修改的字符串内存空间能否容纳拷贝内容,因此strncpy()出现并增加了限制拷贝内容最大长度的参数。

把输出内容传送进字符串

现在终于接触到了一个跟我们最熟悉的printf()是兄弟的函数了,也就是sprintf()。它在<stdio.h>头文件中,不是在<string.h>中。

sprintf()的作用是把括号里诸多内容输出到指定的字符串中。

char a[20];
const char b[7] = "WDNNND";
sprintf(a, "%s%s", b,b);

输出内容:

WDNNNDWDNNND

小结

字符串头文件里还有很多有趣的函数,不过可能我这辈子都用不到吧。