前面我们一起学习了strlen,strcpy,strcmp,strcat的使用以及它们的模拟实现,它们的特点是你传参的时候,传过去的是数组首元素的地址,然后无论是计算长度,实现拷贝,相互比较还是进行追加,处理的对象的都是整个字符串。
但是有时候我们的需求可能仅仅只是针对字符串的一部分实现拷贝,进行比较和追加的相关逻辑,也就是待处理的字符串的长度不应该只是默认的“整个字符串”,有时候让我们的用户来决定可能会更好。据此,引入了今天我们的三大主角,它们分别是:
strncpy | 进行长度不固定的字符串的拷贝,拷贝多少用户说了算! |
strncmp | 进行长度不固定的字符串的比较,比较哪一部分字符用户说了算! |
strncat | 进行长度不固定的字符串的追加,追加多少字符用户说了算! |
接下来,让我们一一来对它们进行认识。
注:这一部分函数的学习我们仅需要对函数各个使用场景有所了解即可,模拟实现不再是重点。
(一)strncpy函数:
介绍:
函数原型:
char * strncpy ( char * destination, const char * source, size_t num );
函数名 | 功能描述 | 头文件 |
strncpy | 将source中前num个字符拷贝到目标空间destination中 | #include<string.h> |
返回值说明:返回的是目标空间destination的地址。
注意事项:
第一、strncpy函数不会在拷贝的最后自动带上'\0',如果拷贝给destination的字符串中本没有'\0',同时destination本身也没有'\0',那destination的内容是什么这是不可知的。如图所示:
我们推介的写法是下面这种的:
第二、如果参数num>source中已有的字符个数,则多出来的部分会用'\0'进行填补追加,直至num个。值得注意的是:这个过程不受destination本身长度的限制,也就是说如果num>strlen(destination)程序会出现问题——数组的越界访问。
(二)strncmp函数:
介绍:
函数原型:
int strncmp ( const char * str1, const char * str2, size_t num );
函数名 | 功能描述 | 头文件 |
strncmp | 从左到右依次比较str1和str2的前num个字符的ASCLL码值 | #include<string.h> |
返回值说明:是一个整数,用于表示str1和str2的大小关系。详情见下表:
return value | 含义 |
<0 | 表明str1 < str2 |
=0 | 表明str1 == str2 |
>0 | 表明str1 > str2 |
(三)strncat函数:
介绍:
函数原型:
char * strncat ( char * destination, const char * source, size_t num );
函数名 | 功能描述 | 头文件 |
strncat | 将source字符串中前num个字符追加到destination后面,并加'\0' | #include<string.h> |
注意事项:
- 目标空间destination的内存务必足够大,至少能同时放下source和destination两个字符串内容的数据。
- 越界追加的问题:即如果num>strlen(souce),函数也仅对souce本身进行追加,不会过度追加。
- 和strcat不同的是,由于strncat函数的特殊机制,strncat函数一般是允许自己追加自己的。