strncat,strncmp,strncpy三个函数都是在原有函数的基础上增加一个参数n进行限制,但是三个函数对于n的理解不是很一样。

strcat与strncat

char * strcat(char * dest, const char * src);
char * strncat(char * dest, const char * src, int n);

strncat 相比于strcat,参数n的作用用来限制添加的字符个数,如果需要添加的字符个数小于n,则直接将src添加到dest的后面,但是如果src的长度大于n,则strncat函数只会复制前面n个字符同时在末尾添加'\0'作为结尾!

strcmp与strncmp

char * strcmp(char * dest, const char * src);
char * strncmp(char * dest, const char * src, int n);

strncmp中的n表示比较前n个字符。

strcpy与strncpy

char * strcpy(char * dest, const char * src);
char * strncpy(char * dest, const char * src, int n);

strncmp中的n非常关键,如果src的长度小于n,则将src的内容复制到dest中(同时会复制结尾处的'\0'),如果src的长度大于等于n,则strncmp只会复制前n个字符,不会在末尾添加'\0'.

最后注意:上面所有函数都不做内存大小的检查,也就是要求我们在使用上面函数的时候,程序员需要自己确定传入的指针所指向的内存是否足够大。

附:自己写的上面几个函数的实现

char * my_strcpy(char * dest, const char * src){
    if(!dest || !src) return NULL;

    char * pdest = dest;
    const char * psrc =  src;
    while(*psrc != '\0'){
        *pdest++ = *psrc++;
    }
    *pdest = '\0';
    return dest;
}

char * my_strncpy(char * dest, const char * src, int n){
    if(!dest || !src) return NULL;

    char * pdest = dest;
    const char * psrc =  src;
    while((n--)&&(*psrc != '\0')){
        *pdest++ = *psrc++;
    }
    if(n>=0){
        *pdest = '\0';
    }
    return dest;
}

int my_strcmp(const char * str1, const char * str2){
    if(!str1 || !str2) return 0;

    while(*str1 == *str2){
        if(*str1 == '\0'){
            return 0;
        }
        str1++;
        str2++;
    }
    if(*str1 > *str2) return 1;
    else return -1;
}

int my_strncmp(const char * str1, const char * str2, int n){
    if(!str1 || !str2) return 0;

    while(*str1 == *str2){
        if(*str1 == '\0'){
            return 0;
        }
        if(--n == 0) return 0;
        str1++;
        str2++;
    }
    if(*str1 > *str2) return 1;
    else return -1;
}

char * my_strcat(char * dest, const char * src){
    if(!dest || !src) return NULL;

    char * res = dest;
    while(*dest != '\0'){
        dest++;
    }
    while(*src != '\0'){
        *dest++ = *src++;
    }
    *dest = '\0';
    return res;
}

char * my_strncat(char * dest, const char * src, int n){
    if(!dest || !src) return NULL;

    char * res = dest;
    while(*dest != '\0'){
        dest++;
    }
    while((n--) && (*src != '\0')){
        *dest++ = *src++;
    }
    *dest = '\0';
    return res;
}