👑个人主页:啊Q闻
🎇收录专栏:《C语言》
🎉道阻且长,行则将至
前言
这篇博客是字符串函数下篇,主要是关于长度受限制的字符串函数(strncpy,strncat,strncmp)的使用和模拟实现,还有一些字符串函数的相关知识。
一.strncpy
1.使用
注1:拷贝num个字符从源字符串到目标空间
注2:如果源字符串的长度小于num,则拷贝完源字符串之后,在后面追加'\0',直至到num个。
运行结果:
注2解释:
2.模拟实现
char* my_strncpy(char* dest, const char* src, size_t num)
{char* ret = dest;assert(dest);assert(src);int i = 0;while (i < num)//打印拷贝字符,以拷贝字符数作为限制条件{*dest = *src;dest++;src++;i++;}*dest = '\0';return ret;
}
二.strncat
1.使用
注1:将source指向的字符串的前num个字符追加到destination指向的字符串末尾,再追加一个'\0'。
注2:如果sorce指向的字符串长度小于num时,只会将字符串中至'\0'前的内容追加到destination指向的字符串末尾
运行结果:
调试结果证明注1:
当num大于sorce字符串长度的时候,运行结果如下:
调试结果可证明注2:
2.模拟实现
char* my_strncat(char* dest, const char* src, size_t num)
{char* ret = dest;assert(dest);assert(src);int i = 0;while (*dest){dest++;}while (i < num){*dest = *src;dest++;src++;i++;}*dest = '\0';return ret;
}
三.strncmp
1.使用
注1:该函数用于比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不一样就提前结束
运行结果:
2.模拟实现
int my_strncmp(char* str1, const char* str2, size_t num)
{int i = 0;assert(str1);assert(str2);for (i = 0; i < num; i++)//循环限制条件为小于比较字符个数{if (*str1 == *str2)//如果比较相等就往后移{str1++;str2++;}else{return *str1 - *str2;//不相等就比较大小}}return 0;//当跳出循环时,证明两个字符串比较部分完全相等
}int main()
{char s1[20] ="hello";char s2[] = "aello";int ret=my_strncmp(s1, s2, 3);printf("%d\n", ret);return 0;
}
也可以:
int my_strncmp(char* str1, const char* str2, size_t num)
{int ret = 0;assert(str1);assert(str2);while (num--){ret = *str1 - *str2;if (ret != 0)//不等于0就跳出,返回一个非0的数break;str1++;str2++;}return ret;//跳出整个循环时证明两个字符串比较部分相等
}
四.strstr
1.使用
注1:函数返回字符串str2在字符串str1第一次出现的位置
注2:字符串的比较匹配不包含\0字符,以\0结尾
运行结果:
2.模拟实现
char* my_strstr(const char* str1, const char* str2)
{const char* cur = str1;const char* s1 = NULL;const char* s2 = NULL;assert(str1 && str2);if (*str2 == '\0'){return (char*)str1;}while (*cur){s1 = cur;s2 = str2;while (*s1 == *s2 && *s1 && *s2){s1++;s2++;}if (*s2 == '\0'){return (char*)cur;}cur++;}return NULL;
详解:
谢谢你的阅读,如果对你有帮助的,三连么么么