C库函数:模拟实现 strncpy, strncat, strncmp

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;
}

猜你喜欢

转载自blog.csdn.net/qq_39026129/article/details/80438262
今日推荐