1.strncpy
描述
C 库函数 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
声明
下面是 strncpy() 函数的声明。
char *strncpy(char *dest, const char *src, size_t n)
参数
dest -- 指向用于存储复制内容的目标数组。
src -- 要复制的字符串。
n -- 要从源中复制的字符数。
返回值
该函数返回最终复制的字符串。
代码实现
- 不考虑src的长度小于len:
char *_strncpy(char *dest, const char *src, size_t len)
{
assert(dest != NULL && src != NULL);
char *ret = dest;
while (len--) {
*dest++ = *src++;
}
return ret;
}
- 当src的长度小于len呢?这份代码没有处理这个问题。
《C和指针》:
和strcpy一样,strncpy把源字符串的字符复制到目标数组。然而,它总是正好向dst写入len个字符。如果strlen(src)的值小于len,dst数组就用
额外的NUL字节填充到len长度,如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中。”
注意!它的结果将不会以NUL字节结尾。(NUL即‘\0’).
由此可见,我们还需要判断strlen(src)是否小于len,如果是,还需要在dst后面添加NUL,因此,正确的代码应该如下:
char *_strncpy(char *dest, const char *src, size_t len)
{
assert(dest != NULL);
assert(src != NULL);
char *ret = dest;
int offset = 0;
if (strlen(src) < len){//src长度小于len
offset = len - strlen(src);
len = strlen(src);
}
while (len--){
*dest++ = *src++;
}
while (offset--){
*dest++ = '\0';
}
return ret;
}
2.模拟实现strncat
描述
C 库函数 char *strncat(char *dest, const char *src, size_t n) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。
声明
下面是 strncat() 函数的声明。
char *strncat(char *dest, const char *src, size_t n)
参数
dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
src -- 要追加的字符串。
n -- 要追加的最大字符数。
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
代码实现
char *_strncat(char *dest, const char *src, int len)
{
assert(dest != NULL);
assert(src != NULL);
char *ret = dest;
while (*dest){//找到dest中的'\0'
dest++;
}
while (len--){
*dest++ = *src++;
}
*dest = '\0';
return ret;
}
3.模拟实现strncmp
描述
C 库函数 int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节。
声明
下面是 strncmp() 函数的声明。
int strncmp(const char *str1, const char *str2, size_t n)
参数
str1 -- 要进行比较的第一个字符串。
str2 -- 要进行比较的第二个字符串。
n -- 要比较的最大字符数。
返回值
该函数返回值如下:
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。
代码实现
int _strncmp(const char *str1, const char *str2, size_t n)
{
assert(str1);
assert(str2);
while (n--){
if (*str1 == *str2){
str1++;
str2++;
}
else{
if (*str1 < *str2)
return -1;
else
return 1;
}
}
return 0;
}