目录
strtok函数
strtok函数是可以用分隔符来切割字符串的函数,它具有保存字符串的功能。
strtok函数找到str中的下一个标记,并将其用’\0'结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改。)
返回值:char*类型
头文件:#include<string.h>
char * strtok ( char * str, const char * sep );
sep参数是个字符串,定义了用作分隔符的字符集合;比如
创建一个字符串 :
char arr[ ] = "123456789@qq.com"
这个字符串中的@和 . 就是分隔符的集合 "@."
sep就可以指向分隔符的集合,也可以说将字符串“@.”传给sep
而第一个参数str指定了一个字符串,它包含了0个或者多个由sep字符串中的一个或者多个分隔符分割的标记。就是说str其实是一个字符串,就是我们创建的arr。
1、strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存他在字符串中的位置,这也就是他的保存功能。
2、strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
3、如果字符串中不存在更多的标记,则返回NULL指针。
我们还是以 这个为例:
char arr[ ] = "123456789@qq.com";
const char* p=”@.“;
第一次使用这个strtok函数时,他会将‘@’调换为‘\0’来返回首字符的位置,
strtok(arr,p);
但是再次调用strtok函数的时候,就不能使用arr了,我们要使用空指针NULL
strtok(NULL,p) ;
多说无益,上代码:
int main()
{
char arr[] = "123456789@qq.com";
char buf[200] = { 0 };
strcpy(buf, arr);//这里用strcpy函数临时拷贝arr,因为strtok函数会改变被操作的arr字符串
const char* p = "@.";
char* str = strtok(buf, p);
printf("%s\n", str);//第一次打印
str = strtok(NULL, p);
printf("%s\n", str);//第二次打印
str = strtok(NULL, p);
printf("%s\n", str);//第三次打印
return 0;
}
运行结果:
但是这样写代码冗余,我们可以简单优化一下,这里采用for循环的模式:
strerror函数(了解就可以)
strerror函数是把错误码转化为错误信息
返回值:char*类型
头文件:#include<string.h>
像浏览器出现的404也是错误码,在大学中选课的时候,网站崩掉时显示的也是错误码。
下面看一下使用示例:
int main()
{
printf("%s\n", strerror(0));
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
printf("%s\n", strerror(3));
printf("%s\n", strerror(4));
return 0;
}
运行结果:
字符分类函数:
函数 | 如果他的参数符合下列条件就返回真 |
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v' |
isdigit | 十进制数字 0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母a~z或A~Z |
isalnum | 字母或者数字,a~z,A~Z,0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
这些都是一些常用的
下面举几个例子:
isdigit函数
头文件时:#include<ctype.h>
isdigit函数是如果传进去的是非数字字符,它返回的就是0,如果传进去 的是数字字符,它返回的是非0字符。
函数示例:传入非数字字符
int main()
{
char ch = 'A';//'0' '1' '2' '3' .... '9'
int ret = isdigit(ch);
printf("%d\n", ret);
}
运行结果:
函数示例:传入是数字字符
int main()
{
char ch = '2';//'0' '1' '2' '3' .... '9'
int ret = isdigit(ch);
printf("%d\n", ret);
}
运行结果:
内存函数:memcpy函数
memcpy函数是内存拷贝函数
返回值:void*类型
参数:有三个参数,第一个和第二个都是void* 类型,任何类型都可以传。第三个是size_t类型,也是unsigned int类型
,传的是字节数。
头文件:#include<string.h>
函数示例:
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr, 20);
return 0;
}
运行内存结果:
我们可以看到在内存中已经将值传进去了。
模拟实现:
void* my_memcpy(void* dest, void* src, size_t num)
{
void* ret = dest;
assert(dest);
assert(src);
while(num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
运行结果:
memmove函数:
memmove函数是内存拷贝的函数,没有类型限制,但是memmove使用要考虑内存重叠问题
返回值:void*类型
头文件:#include<string.h>
memmove函数模拟实现:
void* my_memmove(void* dest, void* src, size_t num)
{
void* ret = dest;
assert(dest);
assert(src);
if (dest < src)//1 前->后
{
while(num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else //2 3 后->前
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1+2, arr1, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
运行结果: