C 可指定长度的字符串函数
头文件
string.h
函数原型
char *strncpy(char *dst, char const *src, size_t len);
char *strncat(char *dst, char const *src, size_t len);
int strcmp(const char *s1, const char *s2, size_t len);
后面len可指定函数需要处理src中多长的子串。
注意事项
注意strncpy这个函数:
- 如果指定长>源长,则将源长全部拷贝到目标长,自动加上’\0’
- 如果指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括’\0’
- 如果指定长>目标长,error happen!
也就是说,此函数不保证复制过去的字符串以’\0’结束。这会导致未定义的行为。看代码:
/**
* OS: win7
* IDE: DEV C++ 4.9.9.2
**/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char string[2];
strncpy(string,"123",1);
printf("%d\n", strlen(string)); // 5
return EXIT_SUCCESS;
}
可见,系统因字符串结尾丢失’\0’而无法准确的统计出字符串的长度。这里有个建议的写法,可有有效防止范围溢出以及丢失’\0’的发生:
char buffer[BUFFER_SIZE];
...
strncpy(buffer, name, BUFFER_SIZE);
buffer[BUFFER_SIZE - 1] = '\0';