strncmp strncat strncpy长度受限制的字符串函数
首先 我们需要知道 这几个的语法格式差不多
这里传递的size_t的长度是传递的字节长度 不是个数 也就这里int*是四个字节 char*是一个字节 如果是整数进行交换 。此时也就需要20个字节,这样可以交换五个整数
这里差异只是多一个参数 也就是size_t sz长度参数
strncpy(拷贝)
这里只是多一个字节长度
这里拷贝三个
这里是让拷贝几个就拷贝几个 没有’\0‘
这里拷贝8个 这里是不足八个 加上'\0'
strncpy代码的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
void my_strncpy(char* str1, char* str2, size_t sz)
{
assert(str1 && str2);
while (sz > 0)//这里是字节交换 每次sz会进行减少一个字节
{
*str1 = *str2;//这里进行复制
str1++; //各自向后移动
str2++;
sz--;//字节每次减少1
}
}
int main()
{
char arr1[] = "dfhguil";
char arr2[100] = { 0 };
my_strncpy(arr2, arr1, 3);
printf("%s", arr2);
return 0;
}
strncat(拼接)
举例1
这里是追加三个字节
举例2
这里是追加3个 从前往后走进行追加 把该追加的追加之后 会放一个字符串
举例3
把该追加的追加之后 加上字符串0 之后就不继续添加了
strncat的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
void my_strncat(char* str1, char* str2, size_t sz)
{
assert(str1 && str2);//这里使用一个断言 也就是只要不是空指针 就可以继续运行
while (*str1 != '\0')//这里是先找到第一个数组的'\0'然后跳出循环
str1++;
while (sz != 0)//其次和之前的循环方式一样 每次减少一个字节 ++ 把数值赋给arr1 但是这里需要知道 这里是常量字符串 所以需要arr1 的空间大于arr2
{
*str1 = *str2;
str1++;
str2++;
sz--;
}
*str1 = '\0';//最后是把'\0'放到字符串的结尾
}
int main()
{
char arr1[100] = "hello ";
char arr2[] = "bitttt";
my_strncat(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}
strncmp(比较)
这里是比较前两个字节
在给定 的长度范围内进行比较
这里你让我拷贝 我就进行拷贝 存在越界访问的情况
这里拷贝出来 但是程序崩溃了
strncmp的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcmp(char* str1, char* str2, size_t sz)
{
assert(str1 && str2);
while (*str1 == *str2)//这里代码循环的条件就是只要相等就继续++ 然后遇见最后一个字符'\0'自然会跳出循环
{
if (sz == 0)//这里每次循环的时候会进行sz的-- 也就是对照字符的-- 如果不满足相等的条件 此时也就会跳出循环
{
return 0;
}
str1++; str2++;
sz--;
}
return *str1 - *str2;
//while (*str1 == *str2 && sz > 0)
//{
// str1++;
// str2++;
// sz--;
//}
//return sz == 0 ? 0:(*str1 - *str2);//这里是使用一个三目操作符 如果满足sz循环 也就是返回0 不然就是返回差值 这样也是允许的
}
int main()
{
char arr1[100] = "hello ";
char arr2[] = "bitttt";
int ret = my_strcmp(arr1, arr2, 3);
printf("%d", ret);
return 0;
}
代码使用的总结
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
int main()
{
//拼接限制函数的使用 这里拼接三个
char arr1[100] = "slaidg ";
char arr2[] = "dfilsug ";
strncat(arr1, arr2, 3);
printf("%s\n\n", arr1);
//拷贝限制函数的使用 这里拷贝五个
char arr3[] = "slaidg ";
char arr4[100] = { 0 };
strncat(arr4, arr3, 5);
printf("%s\n\n", arr4);
//比较函数的使用
char arr5[] = "slaidg ";
char arr6[] = "dfilsug ";
char arr7[] = "slaidg ";
int ret1 = strcmp(arr5, arr6, 3);//不相同 1 前三位比较的时候上面的大 arr5大
int ret2 = strcmp(arr5, arr7, 3);//相同 0 前三位一样大
printf("%d\n%d\n", ret1, ret2);
}
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————