目录
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; }
运行结果: