memmove函数
不知道大家有没有想过,如果是自己复制自己,那memcpy为什么不能用呢?什么函数可以实现呢?
memcpy函数会改变目标数据,如果目标数据与源数据有重叠,可能导致
如下情况:
假设我要把1 2 3 4 复制到3 4 5 6 的位置上,那么从前往后就是如图,我们可以看到原来的3 4 变为了1 2 ,然后1 2 再复制到5 6 处,原来的3 4 5 6 就变为了1 2 1 2,这与我们要的结果不同,所以不能用该函数了,那么我们应该如何才能正确打印呢?
我们发现如果从后往前复制就可以很好的避免这种情况发生,即从两数据重叠处开始复制。而memmove函数就很好的解决了这点。
我们来看看memmove函数:
void * memmove ( void * destination, const void * source, size_t num );
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理
#include<stdio.h> #include<string.h> int main() { int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; memmove(arr1 + 2, arr1, 20); return 0; }
模拟实现
void* m_memmove(void* destination, const void* source, size_t num) { void* p = destination; if (destination < source) { while (num--) { //从前往后复制 *(char*)destination = *(char*)source; destination = (char*)destination + 1; source = (char*)source + 1; } } else { while (num--) { //从后往前复制 *((char*)destination+num) = *((char*)source+num); } } return p; } int main() { int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; m_memmove(arr1 + 2, arr1, 20); return 0; }
strtok函数
char * strtok ( char * str, const char * sep );
1.sep参数是个字符串,定义了用作分隔符的字符集合。
2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。(该函数具有记忆功能)
6.如果字符串中不存在更多的标记,则返回 NULL 指针。
我们来具体看看:
#include<stdio.h> #include<string.h> int main() { char arr[] = "zhangsan@baidu.com"; char buf[200] = { 0 }; strcpy(buf, arr); //将arr的内容复制到buf中 const char* p = "@."; char* str = strtok(buf, p); //找到第第一个标记字符'@',并将其改为'\0',返回指向这个字符串的指针 printf("%s\n", str); //打印: zhangsan str = strtok(NULL, p); //从上次标记的'\0'开始查找下一个标记符号,重复以上操作 printf("%s\n", str); //打印: baidu str = strtok(NULL, p); printf("%s\n", str); //打印: com return 0; }
简化一下:
int main() { char arr[] = "zhangsan@baidu.com"; char buf[200] = { 0 }; strcpy(buf, arr); const char* p = "@."; char* str = NULL; for (str=strtok(buf, p); str!=NULL; str=strtok(NULL, p)) { printf("%s\n", str); } return 0; }
strerror函数
char * strerror ( int errnum );
返回错误码,所对应的错误信息。
#include<stdio.h> #include<string.h> #include<errno.h> int main() { //errno - C语言提供的全局的错误变量 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; }
输出:
其他的错误变量对应的错误码可以自己输出试试。
字符分类函数
返回真就是返回大于0的数,可用于条件判断。
字符转换
int tolower ( int c ); //大写转小写 int toupper ( int c ); //小写转大写
我们来看下面一段小写转大写的代码:
#include<stdio.h> #include <ctype.h> int main() { char arr[] = "Are you ok?"; char* p = arr; while (*p) { if (islower(*p)) //判断是否是小写 { *p = toupper(*p); //小写转大写 } p++; } printf("%s\n", arr); return 0; }
输出:ARE YOU OK?
本希望本期内容对大家能有所帮助,下期见了~