👑个人主页:啊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;
详解:
谢谢你的阅读,如果对你有帮助的,三连么么么