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