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;
}
京公网安备 11010502036488号