strtok函数
char* strtok(char *str,char *sep)
返回的是分割符标记的起始位置
函数作用 给一个邮箱 kajsoijfdcoaioij@.com @ 。被叫做分割符
该函数作用就是提取这些分割符。
第一的参数为字符串,sep参数是个字符串,定义了用做分割符字符的集合
例如
int main() { char arr[] = " kajsoijfdcoaioij@.com "; const char* p = "@."; char bufer[30] = { 0 }; char* str = strtok(bufer, p); strcpy(bufer, arr); //该函数会改变字符串中的分隔符为\0; strtok(bufer, p); //strtok传的第一个参数不为空指针时,读入,当遇到分割符时,变为\0,切割掉返回空指针,保c存分割符的位置,继续进行切割,寻找下一个分割符 //常量i昂字符无法修改 strtok(NULL, p); printf("%s\n", str); strtok(NULL, p); printf("%s\n", str); strtok(NULL, p); printf("%s\n", str); // char* str = NULL; for (str = strtok(bufer, p); str= NULL;str = strtok(NULL,p)) { printf("%s\n", str); } return 0; }
strerror函数
返回错误码所对应的错误信息
char *strerror()
每一个错误码都有错误信息
c语言的库函数再调用失败的时候,会将一个错误码存放在一个叫error的变量中,当我们想知道调用库函数的时候发生了什莫错误,就可以把error里的错误码翻译为错误信息。 例
int main() { char* p = strerror(0); printf("%s\n", p); char* p = strerror(1); printf("%s\n", p); char* p = strerror(2); printf("%s\n", p); char* p = strerror(3); printf("%s\n", p); return 0; }
举例打印文件打开错误
int main() { //打开文件 FILE* p = fopen("text.txt", "r");//如果打开方式是“r”,若文件存在则打开成功,否则失败 //这里未建立这样的文件 if (p == NULL) { printf("打开失败,原因是%s\n",strerror(errno));//显示错误 errno中把错误码翻译成错误信息 //perror函数 打印错误信息 //perror("文件打开失败");把定义的错误信息后在打印错误信息,可以理解为printf+strerror结合函数。 } //读写文件 //关闭文件 fclose(p); p = NULL; return 0; }
这里还有许多常用的字符判断函数。其用法相似。
isdigit
isspace isxdigit islower issupper isalpha isaipha等的函数.
内存函数
不同于字符串函数,这里可以实现各种类型的数据的函数。
memcpy
例如
int main() { int arr1[] = { 1,2,3,4,5,6,7,8,9 }; int arr2[] = { 0 }; //memcpy,拷贝数据 memcpy(arr2, arr1, 20);//把arr1中的5个整形拷贝到arr2中 , size_t num为所拷贝数据内存大小, float arr1[] = { 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0 }; float arr2[] = {0.0}; memcpy(arr2, arr1, 12);//把arr1中的5个整形拷贝到arr2中 return 0; }
函数实现
void* my_memcpy(const void*str,const void *ptr,size_t num) { void* ret = str; assert(str && ptr);//断言判断是否为指针 while (num--) { *(char*)str = *(char*)ptr; str = (char*)str + 1; ptr = (char*)str + 1; } return ret; }
在内存重叠时使用memcpy可能出现其他结果,这时使用memmove,不会重现重叠,数据覆盖
例如
memmove
void* memmove(void* destinnation, void* source, size_tnum)
int main() { int arr1[] = {1,2,3,4,5,6,7,8,9}; int arr2[] = { 1,2 }; memmove(arr2+2, arr1, 12);//把arr1中的5个整形拷贝到arr2中 return 0; }
函数实现
void* my_memmove(const void* str, const void* ptr, size_t num) { //从前往后拷贝和从后往前拷贝 //分情况讨论 //当str<ptr 从前往后拷贝 //当str>ptr 从后往前拷贝 assert(str && ptr); void* ret = str; if (str < ptr) { *(char*)str = *(char*)ptr; str = (char*)str + 1; ptr = (char*)str + 1; } else { //后->前 while (num--) { *((char*)str + num) = *((char*)ptr + num); } } return ret; }
这里存在分情况讨论是因为如图
memcmp
void test() { int arr[] = { 1,2,3,4,5,6,7,8,9 }; int arr1[] = { 1,2,4,6 }; int ret = memcmp(arr,arr1, 16); printf("%d\n", ret); }
memset