文章目录
一、strncpy函数、strncat函数、strncmp函数
1.使用说明
这三个函数本质上与前面那三个函数差不多,前面三个函数长度不受限制,后面三个函数长度受限制,但是后面三个函数相较与前面那三个函数相对稳定安全一些,但也只是相对,也不是百分百安全。
2.模拟代码实现
strncpy函数
char* my_strncpy(char* dest, const char* str, int num)
{
char* ret = dest;
assert(dest != NULL);
assert(str != NULL);
while (num!=0)
{
*dest++ = *str++;
num--;
}
return ret;
}
int main()
{
char arr1[10] = "xxxxxxxxx";
char arr2[] = "ab";
printf("%s\n", my_strncpy(arr1, arr2, 5));//如果字符不够,之后将会用\0补上
return 0;
}
strncat函数
char* my_strncat(char* dest, const char* str,int num)
{
char* ret = dest;
assert(dest != NULL);
assert(str != NULL);
while (*dest)
{
dest++;
}
while (num!=0)
{
*dest++ = *str++;
num--;
}
return ret;
}
int main()
{
char arr1[20] = "abc\0xxxxxxxxx";//从\0后面开始追加
char arr2[] = "def";
printf("%s\n", my_strncat(arr1, arr2, 5));
return 0;
}
strncmp函数
int my_strncmp(const char* scr, const char* str,int num)
{
assert(scr != NULL);
assert(str != NULL);
while (num!=0)
{
if (*scr == '\0')
return 0;
*scr == *str;
scr++;
str++;
num--;
}
if (*scr > *str)
return 1;
else
return -1;
}
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "abcqwer";
int ret = my_strncmp(arr1, arr2, 4);
printf("%d\n", ret);
return 0;
}
二、strstr函数
1.使用说明
从str1中找str2是否存在,返回它第一次出现的位置
或者如果str1中没有str2出现的话,返回一个空指针
2.代码模拟实现
const char* my_strstr(const char* str1, const char * str2)
{
assert(str1);
assert(str2);
const char* cp = str1;
const char* s1 = NULL;
const char* s2 = NULL;
//如果子串是空字符串,直接返回str1
if (*str2 == '\0')
return str1;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 == *s2 && *s1 && *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cp;
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
char* ret = my_strstr(arr1, arr2);
if (ret != NULL)
printf("%s\n", ret);
else
printf("找不到\n");
return 0;
}
三、strtok函数
1.使用说明
后面参数指向⼀个字符串,定义了用作分隔符的字符集合
第⼀个参数指定⼀个字符串,它包含了0个或者多个由后面字符串中⼀个或者多个分隔符分割的标记。
strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串⼀般都是临时拷贝的内容 并且可修改。)
strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
2.代码实现
int main()
{
char arr[] = "yangzhicheng@hehe.niubi";//@. 分割符
char buf[60] = { 0 };
//"zpengwei\0yeah\0net"
strcpy(buf, arr);
char* p = "@.";
char* r = NULL;
for (r = strtok(buf, p); r != NULL; r = strtok(NULL, p))
{
printf("%s\n", r);
}
return 0;
}
四、strerror函数
1.使用说明
在C语言的库函数中设计了一些错误码,当我们在调用的时候发生了各种错误,strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
2.代码实现
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
char * ret = strerror(i);
printf("%d : %s\n", i, ret);
}
return 0;
}
在Windows11+VS2022环境下输出的结果如下:
No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
Input/output error
No such device or address
Arg list too long
Exec format error
Bad file descriptor
No child processes
也可以了解⼀下perror函数,perror函数相当于⼀次将上述代码中的第9行完成了,直接将错误信息打印出来。
int main()
{
FILE* pFile;
pFile = fopen("unexist.ent", "r");
if (pFile == NULL)
perror("Error opening file unexist.ent");
return 0;
}
输出结果:
Error opening file unexist.ent: No such file or directory