与字符有关的较复杂库函数:
前言:当我们只是简单的了解C语言,我们会认识和掌握strcpy,strcmp等简单的库函数,如果想更进一步,我们或许需要掌握更加复杂的库函数。本篇文章就介绍了strtok、strerror、字符判断函数、memcpy、memcmp以及memset函数。
1、strtok函数
在函数定义中的str是目标字符串的地址,sep是分隔符的地址。
在使用这个函数之前我们需要知道这个隐藏的使用规则。
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
有以上规则我们可以敲一个例子:
int main()
{
const char* p = "@.";
char arr[] = "123456789@qq.com";
char buf[50] = {
0 }; //123456789@qq.com
strcpy(buf, arr);
char* str = NULL;
//1、已知字符串情况下
str = strtok(arr, p);//123456789
printf("%s\n", str);
str = strtok(NULL, p);//qq
printf("%s\n", str);
str = strtok(NULL, p);//com
printf("%s\n", str);
//之后返回NULL
//2、未知字符串情况
for (str = strtok(buf, p); str != NULL; str = strtok(NULL, p))
{
printf("%s\n", str);
}
return 0;
}
注:当我们知道字符串的时候我们可以确定使用strtok的此时,当未知字符串我们可使用for循环来完美实现。(第二种方法可以包含第一种)
运行结果:
2、strerror函数
我们先来实现报错:
#include <errno.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%s\n", strerror(i));
}
return 0;
}
运行结果:
同时strerror函数有一个头文件与之对应—#include <errno.h>
然后我们再举一个现实的例子:
#include <errno.h>
int main()
{
FILE* p = fopen("test.txt", "r");
//当库函数使用发生错误会把errno这个
//全局的错误遍历设置为本次库函数产生的
//错误码
//errno是C语言提供的一个全局变量,可直接使用,头文件errno.h
if (NULL == p)
{
printf("%s\n", strerror(errno));
return 0;
}
//........
//关闭文件
fclose(p);
p = NULL;
return 0;
}
此时我的工程内并没有这个test.txt文件。我们当然读取不到,所以就会报错,我们可以用strerror这个函数来找到报错原因。
运行结果:
3、字符串分类函数
这个函数也有自己的头文件—#include <ctype.h>。
例子:
//字符判断函数
int main()
{
printf("%d\n", isspace('!'));//0