1.strncpy
函数原型:
char *strncpy( char *strDest, const char *strSource, size_t count );
char *strDest
目标字符串首元素地址const char *strSource
源字符串(需要拷贝过去的字符串)size_t count
拷贝字符的个数char *strncpy
拷贝结束后,返回目标字符串的起始地址,方便函数的链式访问
函数作用:
拷贝 count
个字符从源字符串到目标空间。如果源字符串的长度小于 count
,则拷贝完源字符串之后,在目标后边追加 '\0'
,直到 count
个。
函数的使用
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "abcdfxxxxxxx";
char str2[] = "qwe";
printf("%s", strncpy(str1, str2, 3));
return 0;
}
函数的注意事项:
1.strncpy
拷贝的时候指定的 count
小于源字符串的长度时,strncpy
是不会拷贝 '\0'
的。
2.如果源字符串的长度小于 count
,则拷贝完源字符串之后,在目标后边追加 '\0'
,直到count
个。
3.strncpy
相对于 strcpy
函数相对安全,但如果目标字符串的空间没有比源字符串空间大,还是会造成程序异常崩溃。
函数的模拟实现:
#include <assert.h>
char* _strncpy(
char* dest,
const char* src,
size_t count
) {
assert(dest != NULL && src != NULL);
char* temp = dest;
while (count) {
if (*src) {
*dest++ = *src++;
}
else {
*dest++ = '\0';
}
count--;
}
return temp;
}
2.strncat
函数原型:
char *strncat( char *strDest, const char *strSource, size_t count );
char *strDest
目标字符串首元素地址const char *strSource
源字符串(需要追加过去的字符串)size_t count
追加字符的个数char *strncat
追加结束后,返回目标字符串的起始地址,方便函数的链式访问
函数作用:
追加 count
个字符从目标字符串'\0'
的位置开始追加。如果count
小于源字符串的长度,那么追加结束后会主动添加'\0'
。如果count
大于源字符串的长度,则strncat
等价于strcat
。
函数的使用
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "hello\0##########";
char str2[] = "qwe";
printf("%s", strncat(str1, str2 , 6)); // count大于str2的长度,所以这里strncat等价于strcat
return 0;
}
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "hello\0##########";
char str2[] = "qwe";
printf("%s", strncat(str1, str2, 2)); // count小于字符串长度,追加过去之后会添加'\0'
return 0;
}
函数的注意事项:
1.如果count
小于源字符串的长度,那么追加结束后会主动添加'\0'
。
2.如果count
大于源字符串的长度,则strncat
等价于strcat
。
3.strncat
相对于 strcat
函数相对安全,但如果目标字符串的空间没有比源字符串空间大,还是会造成程序异常崩溃。
4.目标字符串中要有'\0'
,因为strncat
是从目标字符串'\0'
的位置开始追加。
5.源字符串中也有'\0'
,当count
大于源字符串的长度,strncat
会把源字符串全部追加过去,没有'\0'
的话,会造成越界访问。
6.strncat
可以自己追加自己。
函数的模拟实现
#include <assert.h>
char* _strncat(
char* dest,
const char* src,
size_t count
) {
assert(dest != NULL && src != NULL);
char* temp = dest;
while (*dest) {
dest++;
}
while ((count--) && (*src) && (*dest++ = *src++));
*dest = '\0';
return temp;
}
3.strncmp
函数原型:
int strncmp( const char *string1, const char *string2, size_t count );
const char *string1
是第一个字符串的起始地址const char *string2
是第二个字符串的起始地址size_t count
比较的个数int strncmp
返回一个整型- > 0 说明第一个字符串大于第二个字符串
- < 0 说明第一个字符串小于第二个字符串
- = 0 说明两个字符串相等
函数作用: 判断两个字符串在count
的范围是否相等。
函数的模拟实现
int _strncmp(
const char* string1,
const char* string2,
size_t count
) {
assert(string1 && string2);
while ( (count) && (*string1 == *string2) && (*string1) && (*string2)) {
string1++;
string2++;
count--;
}
return (count ? *string1 - *string2 : *(string1 - 1) - *(string2 - 1));
}