怎么做挣钱的网站,seo推广内容,建站不备案,怎样做分销网站8 strsrt
char * strstr ( const char *str1, const char * str2);查找子字符串
返回指向 str1 中第一次出现的 str2 的指针#xff0c;如果 str2 不是 str1 的一部分#xff0c;则返回 null 指针。匹配过程不包括终止 null 字符#xff0c;但会在此处停止。
8.1 库函数s…8 strsrt
char * strstr ( const char *str1, const char * str2);查找子字符串
返回指向 str1 中第一次出现的 str2 的指针如果 str2 不是 str1 的一部分则返回 null 指针。匹配过程不包括终止 null 字符但会在此处停止。
8.1 库函数strstr使用
#includestdio.h
#include string.h
int main()
{char arr1[] abcdefba;char arr2[] def;char* ret strstr(arr1, arr2);if (ret NULL){printf(找不到\n);}else{printf(%s\n, ret);}return 0;
} 它会返回找到相同字符串的地址所以可以直接打印。 8.2strstr库函数模拟实现
#includestdio.h
#include string.hchar* my_strstr(const char* arr1, const char* arr2)
{assert(arr1 arr2);if (*arr2 \0){return NULL;}const char* s1 NULL;const char* s2 NULL;const char* cp arr1;while (*cp){s1 cp;s2 arr2;while (*s1 !\0 *s2!\0 *s1 *s2){s1;s2;}if (*s2 \0){return (char*)cp;}cp;}return NULL;
}int main()
{char arr1[] abcdefba;char arr2[] def;char* ret my_strstr(arr1, arr2);if (ret NULL){printf(找不到\n);}else{printf(%s\n, ret);}return 0;
} 9 strtok
char * strtok ( char * str, const char * sep );sep参数是个字符串定义了用作分隔符的字符集合第一个参数指定一个字符串它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。strtok函数找到str中的下一个标记并将其用 \0 结尾返回一个指向这个标记的指针。注strtok函数会改变被操作的字符串所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。strtok函数的第一个参数不为 NULL 函数将找到str中第一个标记strtok函数将保存它在字符串 中的位置。strtok函数的第一个参数为 NULL 函数将在同一个字符串中被保存的位置开始查找下一个标 记。如果字符串中不存在更多的标记则返回 NULL 指针。
9.1 库函数strtok的使用
#includestdio.h
#include string.hint main()
{char arr[] 192.168.10.123;char* p .;char buf[20] { 0 };strcpy(buf, arr);char* ret NULL;for (ret strtok(buf, p); ret ! NULL; retstrtok(NULL, p)){printf(%s\n, ret);}return 0;
}10 strerror C语言的库函数在运行的时候如果发生错误就会将错误码存在一个变量中这个变量是errno 错误码是一些数字1 2 3 4 5 我们需要讲错误码翻译成错误信息 所以就有了strerror这个函数 char * strerror ( int errnum );返回错误码所对应的错误信息。
使用示例1 2.使用示例2 我们这里使用了一个fopen()函数 #include errno.hint main()
{//打开文件FILE* pf fopen(test.txt, r);//fopen会在vs的当前文件夹中去寻找文件我们当前文件夹没有创建这个文件if (pf NULL){printf(%s\n, strerror(errno));//perror(fopen);return 1;}//读文件//关闭文件fclose(pf);pf NULL;return 0;
}11 字符分类函数
函数如果它的参数符合下列条件就返回真iscntrl任何控制字符isspace空白字符空格‘ ’换页‘f’换行n’回车制表符‘t’或者垂直制表符‘v’isdigit十进制数字 0~9isxdigit十六进制数字包括所有十进制数字小写字母a ~ f大写字母A ~ Fislower小写字母a-zisupper大写字母A-Zisalpha字母a~z或A-Zisalnum字母或者数字a ~ z,A-Z,0 ~ 9ispunct标点符号任何不属于数字或者字母的图形字符(可打印)isgraph任何图形字符isprint任何可打印字符包括图形字符和空白字符 示例1 示例2 示例3 12 memcpy
void * memcpy ( void * destination, const void * source, size_t num );函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 ‘\0’ 的时候并不会停下来。如果source和destination有任何的重叠复制的结果都是未定义的。
12.1 memcpy模拟实现
#includestdio.h
#include string.hvoid* my_memcpy(void* dest, const void* src, size_t num)
{void* ret dest;assert(dest 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 , 16);return 0;
} 13 memmove
void * memmove ( void * destination, const void * source, size_t num );和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠就得使用memmove函数处理。
13.1 memmove模拟实现 分析 void* my_memmove(void* dest, const void* src, size_t num)
{void* ret dest;assert(dest src);if (dest src){//前--后while (num--){*(char*)dest *(char*)src;dest (char*)dest 1;src (char*)src 1;}}else{//后-前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(arr13, arr1 , 16);return 0;
}13 memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );比较从ptr1和ptr2指针开始的num个字节返回值如下