目录
strtok函数
strerror函数
内存函数
memcpy
memmove
memcmp
memset
char* strtok(char *str,char *sep)
返回的是分割符标记的起始位置
函数作用 给一个邮箱 [email protected] @ 。被叫做分割符
该函数作用就是提取这些分割符。
第一的参数为字符串,sep参数是个字符串,定义了用做分割符字符的集合
int main()
{
char arr[] = " [email protected] ";
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;
}
返回错误码所对应的错误信息
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等的函数.
不同于字符串函数,这里可以实现各种类型的数据的函数。
例如
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,不会重现重叠,数据覆盖
例如
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)
{
//从前往后拷贝和从后往前拷贝
//分情况讨论
//当strptr 从后往前拷贝
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;
}
这里存在分情况讨论是因为如图
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);
}