部分字符串和内存操作函数
字符串函数strtok
char* strtok(char* str,const char* sep);
- sep参数是一个字符串,定义了用作分隔符的字符集合
- 第一个参数指定一个字符串,即要被分割的字符串
- 这个函数很特殊,它具有记忆功能,当它第一次使用时,他会找到一个分隔符的位置并且记下来。当第二次调用时,此时不需要再传一个参数,函数会自动在同一个字符中的保存位置开始寻找第二个分隔符的位置,并返回指向标记的指针,如果字符串中不存在更多标记,则返回NULL指针。
- 需要注意的是,由于函数会修改字符串,所以一般操作的都是字符串的拷贝
int main()
{
char* p = "hangtinglong@qq.com";
const char* sep = "@.";
char arr[30];
char* str = NULL;
strcpy(arr, p);
for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)) {
printf("%s\n", str);
}
}
效果如下图:
字符串函数strerror
char* strerroe(int errnum);
返回错误码,所对应的错误信息。
int main()
{
FILE* pFile;
pFile = fopen("unexist.txt", "r");
if (pFile == NULL) {
printf("错误信息是:%s\n", strerror(errno));
}
return 0;
}
当此时的文件夹中并没有这个文件时,运行结果如下:
- 与上面相对应的还有一个perror函数
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile=fopen ("unexist.txt","rb");
if (pFile==NULL)
perror ("The following error occurred");
else
fclose (pFile);
return 0;
}
perror函数将自动打印处此时的错误信息
内存操作函数
memcpy
void* memcpy(void* destination,const coid* source,size_t num);
- 函数从source的位置开始向后复制num个字节的内容到destination中。
- 这个函数在遇到/0时并不会停下来
- 如果source和destination有重叠,用memmove函数
struct {
char name[40];
int age;
}person,person_copy;
int main()
{
char myname[] = "Pierre de Fermat";
memcpy(person.name, myname, strlen(myname) + 1);
person.age = 46;
//先复制字符串
memcpy(&person_copy, &person, sizeof(person));
//再复制结构体
printf("person_copy:%s,%d\n", person_copy.name, person_copy.age);
return 0;
}
memmove
void* memmove(void* destination,const void* source,size_of num);
- 与memcpy的区别在于,memmove函数处理的源内存块和目标内存块是可以重叠的。
int main() {
char str[] = "memmove can be very useful......";
memmove(str + 20, str + 15, 11);
puts(str);
return 0;
}
memcmp
int memcmp(const void* ptr1,
const coid* ptr2,
size_t num);
比较从ptr1和ptr2指针开始的num个字节
返回值三种类型